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
}