Swift - 具有实现通用协议的值的Typealias字典

时间:2014-09-19 15:53:13

标签: ios swift protocols

我想输入一个String键的字典和实现Equatable协议的对象/结构的值。所以我写了这行代码,但它给了我错误,我不知道如何继续修复。

typealias Storage = [String: Equatable]

我想使用类型[String:Equatable]作为协议中的变量,例如:

protocol StorageModel {
    var storage: Storage { get set }
    init(storage: Storage)
}

错误:

  

协议' Equatable'只能用作通用约束因为   它有自我或相关的类型要求

enter image description here 有人可以提出解决方案吗?

1 个答案:

答案 0 :(得分:5)

一般来说,协议标签不是必需的,协议名称是一流的类型名称,可以直接使用:

typealias Storage = [String:Equatable]

在这种情况下,错误告诉您的是因为Equatable包含func == (lhs:Self, rhs:Self) -> Bool且具体为lhs:Self,所以除了作为泛型的约束外,不能使用Equatable:

class Generic<T:Equatable> { ... }

如果没有关于您尝试实现的内容以及您尝试使用StorageModel的更多细节,我能想到的最好的是:

protocol Matches {
    typealias T
    func matches(t:T) -> Bool
}

protocol StorageModel {
    typealias T
    var storage: [String:T] { get set }
    init(storage:[String:T])
}

extension Int : Matches {
    func matches(target:Int) -> Bool {
        return self == target
    }
}

class MyClass <T:Matches> {
    var model = [String:T]()


}

另一种可能性是使用泛型而不是协议:

class StorageModel <T:Equatable> {
    var storage: [String:T]

    init(storage:[String:T]) {
        self.storage = storage
    }
}

从那里你需要做一些研究,深入研究Swift手册,做一些谷歌搜索,看看是什么解决了你的问题。