【问题标题】:Swift - Typealias dictionary with value that implements a generic protocolSwift - 具有实现通用协议的值的 Typealias 字典
【发布时间】:2014-09-19 15:53:12
【问题描述】:

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

typealias Storage = [String: Equatable]

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

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

错误:

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

任何人都可以提出解决方案吗?

【问题讨论】:

    标签: ios swift protocols


    【解决方案1】:

    一般来说不需要protocol标签,protocol名是一等类型名,可以直接使用:

    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 手册,做一些谷歌搜索,看看什么能解决你的问题。

    【讨论】:

    • 换句话说,我应该如何实现这一目标?
    • 由于 Equatable 的定义方式,如果不定义自己的看起来很像 Equatable 的协议,我认为你不能这样做,即使那样我认为你也会遇到同样的问题。您最好的选择可能是定义一个定义 equals 方法并使用它的新协议。
    • 我刚刚更新了这个问题,你能帮我解决一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多