ios – Swift – Typealias字典,其值为实现通用协议

ios – Swift – Typealias字典,其值为实现通用协议,第1张

概述我想输入一个String键的字典和实现Equatable协议的对象/结构的值.所以我写了这行代码,但它给了我错误,我不知道如何继续修复. typealias Storage = [String: Equatable] 我想使用类型[String:Equatable]作为协议中的变量,例如: protocol StorageModel { var storage: Storage { get 我想输入一个String键的字典和实现Equatable协议的对象/结构的值.所以我写了这行代码,但它给了我错误,我不知道如何继续修复.

typealias Storage = [String: Equatable]

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

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

错误:

Protocol ‘Equatable’ can only be used as a generic constraint because
it has Self or associated type requirements

谁有人建议解决方案?

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

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

总结

以上是内存溢出为你收集整理的ios – Swift – Typealias字典,其值为实现通用协议全部内容,希望文章能够帮你解决ios – Swift – Typealias字典,其值为实现通用协议所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1070017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存