今天学员群里有人提了这么一个问题,为什么把特性的字典类型作为泛型类型约束的时候,就必然报错?
1 |
inheritance from non-protocol, non-class type 'Dictionary<String, Any>' |
显然,说的很明确了,“你不能从一个非协议、非类的类型继承”。显然,字典是个泛型结构体……
那么解决思路也很明确了,创建一个类来装饰个字典或许是个不错的选择但太麻烦,那么就从协议上下手。
有条件的协议遵循
我们可以给字典这个结构体进行扩展,让它遵循一个我们的空协议:
1 |
protocol targetDictionaryType {} |
但注意这里我们限定条件,即字典的 Key 必须是 String 类型:
1 |
extension Dictionary :targetDictionaryType where Key == String {} |
内容全部为空,因为不用做任何额外的操作。
这样,我们就可以用这个协议来进行约束了,如果字典的类型不符合要求,那么这个字典就不会遵循我们的协议:
1 2 3 |
func test<T:targetDictionaryType>(dict:T) { ... } |
测试结果
1 2 3 4 |
let d = ["":1] test(dict: d) //正常工作 |
1 2 3 4 5 |
let a = [1:1] test(dict: a) //error: cannot invoke 'test(dict:)' with an argument list of type '(dict: [Int : Int])' |
本文由 落格博客 原创撰写:落格博客 » Swift 中如何使用字典类型作为泛型约束
转载请保留出处和原文链接:https://www.logcg.com/archives/3101.html
范型=?泛型
靠这个居然没统一,是泛型!
改好了~