使用其他协议的Swift协议会导致错误

时间:2018-07-04 12:45:17

标签: swift protocols

我正在使用Swift 4。

我想定义一个问题。

问题由问题和答案组成。

问题可能是以下任意一项:字符串,整数,[整数],图像,[图像]或未定义的某些新类型,或者可能是上述形式的某种组合。

答案也可以是上述任何一种,但是给定的问题可以具有不同类型的答案。

(例如问题=(图片,“这是哪种动物?”,答案=(“猫”))

所以我认为协议将是必经之路:

protocol Posable {
  var pose: String { get }
}

protocol Answerable: Hashable {
  var answer: String { get }
}

protocol Puzzle {
  var problem: Posable { get }
  var solution: Answerable { get }
}

我将“可回答的哈希”设置为“可哈希”是因为我希望能够比较答案并创建答案集。

但是我得到了解决方案:可回答的行:

'Protocol'Answerable'只能用作通用约束,因为它具有Self或关联的类型要求。

我知道为什么会这样...

任何人都可以对如何实现这一点提出任何建议,以免我遇到这个问题吗?

我热衷于在可能的情况下使用协议,部分是为了让我了解它们。

2 个答案:

答案 0 :(得分:1)

我会用泛型解决它:

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)

泛型允许您编写非常可重用的代码!在这里,您可以将任何类用作问题或答案。

通过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)

答案 1 :(得分:1)

我不确定,但是您可以从<div class="container"> <div class="item1">Item1</div> <div class="item2">Item2</div> <div class="item3">Item3</div> <div class="item4">Item4</div> <div class="item5">Item5</div> </div>中删除Hashable

Answerable