Swift 协议使用其他协议导致错误
Swift protocol using another protocol causes error
我在 Swift 4.
工作
我想定义一个问题。
一个问题由一个问题和一个答案组成。
问题可能是以下任何一种:String、Int、[Int]、Image、[Image] 或一些未定义的新类型,或者可能是上述的某种组合。
答案也可能是以上任何一种,但给定的问题可以有不同类型的答案。
(例如问题 =(图片,"What type of animal is this?), answer = ("一只猫"))
所以我认为协议是可行的方法:
protocol Posable {
var pose: String { get }
}
protocol Answerable: Hashable {
var answer: String { get }
}
protocol Puzzle {
var problem: Posable { get }
var solution: Answerable { get }
}
我制作了 Answerable Hashable 是因为我希望能够比较答案并创建答案集。
但我得到了解决方案:可应答行:
'协议'Answerable'只能作为泛型约束,因为它有Self或关联类型要求。
我明白为什么会这样但是...
任何人都可以就如何实现这个提出任何建议,这样我就不会 运行 陷入那个问题吗?
如果可能的话,我很想使用协议来实现,部分原因是为了了解它们。
我会用泛型解决它:
import UIKit
struct Posable<T> {
var pose: T
}
struct Answerable<T> {
var answer: T
}
extension Answerable: Equatable where T: Equatable {
static func ==(lhs: Answerable<T>, rhs: Answerable<T>) -> Bool {
return lhs.answer == rhs.answer
}
}
extension Answerable: Hashable where T: Hashable {
var hashValue: Int {
return answer.hashValue
}
}
struct Puzzle<T, U> {
var problem: Posable<T>
var solution: Answerable<U>
}
let image = UIImage() // Image of a cat
let pose = Posable<(UIImage, String)>(pose: (image, "What type of animal is this?"))
let solution = Answerable<String>(answer: "A cat")
let myPuzzle = Puzzle<(UIImage, String), String>(problem: pose, solution: solution)
泛型让您可以制作出可重用的代码!在这里您可以使用任何 class 作为问题或答案。
使用 Swift 类型继承:您还可以简化初始化:
let image = UIImage() // Image of a cat
let pose = Posable(pose: (image, "What type of animal is this?"))
let solution = Answerable(answer: "A cat")
let myPuzzle = Puzzle(problem: pose, solution: solution)
我不确定,但你可以从 Answerable
中删除 Hashable
。
protocol Posable {
var pose: String { get }
}
protocol Answerable {
var answer: String { get }
}
protocol Puzzle {
var problem: Posable? { get }
func getSolution<T: Hashable & Answerable>() -> T
}
我在 Swift 4.
工作我想定义一个问题。
一个问题由一个问题和一个答案组成。
问题可能是以下任何一种:String、Int、[Int]、Image、[Image] 或一些未定义的新类型,或者可能是上述的某种组合。
答案也可能是以上任何一种,但给定的问题可以有不同类型的答案。
(例如问题 =(图片,"What type of animal is this?), answer = ("一只猫"))
所以我认为协议是可行的方法:
protocol Posable {
var pose: String { get }
}
protocol Answerable: Hashable {
var answer: String { get }
}
protocol Puzzle {
var problem: Posable { get }
var solution: Answerable { get }
}
我制作了 Answerable Hashable 是因为我希望能够比较答案并创建答案集。
但我得到了解决方案:可应答行:
'协议'Answerable'只能作为泛型约束,因为它有Self或关联类型要求。
我明白为什么会这样但是...
任何人都可以就如何实现这个提出任何建议,这样我就不会 运行 陷入那个问题吗?
如果可能的话,我很想使用协议来实现,部分原因是为了了解它们。
我会用泛型解决它:
import UIKit
struct Posable<T> {
var pose: T
}
struct Answerable<T> {
var answer: T
}
extension Answerable: Equatable where T: Equatable {
static func ==(lhs: Answerable<T>, rhs: Answerable<T>) -> Bool {
return lhs.answer == rhs.answer
}
}
extension Answerable: Hashable where T: Hashable {
var hashValue: Int {
return answer.hashValue
}
}
struct Puzzle<T, U> {
var problem: Posable<T>
var solution: Answerable<U>
}
let image = UIImage() // Image of a cat
let pose = Posable<(UIImage, String)>(pose: (image, "What type of animal is this?"))
let solution = Answerable<String>(answer: "A cat")
let myPuzzle = Puzzle<(UIImage, String), String>(problem: pose, solution: solution)
泛型让您可以制作出可重用的代码!在这里您可以使用任何 class 作为问题或答案。
使用 Swift 类型继承:您还可以简化初始化:
let image = UIImage() // Image of a cat
let pose = Posable(pose: (image, "What type of animal is this?"))
let solution = Answerable(answer: "A cat")
let myPuzzle = Puzzle(problem: pose, solution: solution)
我不确定,但你可以从 Answerable
中删除 Hashable
。
protocol Posable {
var pose: String { get }
}
protocol Answerable {
var answer: String { get }
}
protocol Puzzle {
var problem: Posable? { get }
func getSolution<T: Hashable & Answerable>() -> T
}