Swift2:为什么';这个字典扩展不编译吗?
Xcode7抛出:Swift2:为什么';这个字典扩展不编译吗?,swift,generics,dictionary,Swift,Generics,Dictionary,Xcode7抛出: 无法为“Dictionary”类型的值下标“T”类型的索引。 我错过了什么 extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { func boolOr<T:StringLiteralConvertible>(fall: Bool, key: T) -> Bool { return (self[key] as? Bool) ?? fal
无法为“Dictionary”类型的值下标“T”类型的索引。
我错过了什么
extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
func boolOr<T:StringLiteralConvertible>(fall: Bool, key: T) -> Bool {
return (self[key] as? Bool) ?? fall
}
}
正如注释中已经提到的,类型约束 在
boolOr()
方法上,不需要:
extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
func boolOr(fall: Bool, key: Key) -> Bool {
return (self[key] as? Bool) ?? fall
}
}
因为扩展声明中已经限制了密钥类型。
您的代码无法编译,因为
引入一个本地类型占位符T
,该占位符与
键
字典的类型
但事实上我不明白你为什么要限制
关键类型:
extension Dictionary where Value: AnyObject {
func boolOr(fall: Bool, key: Key) -> Bool {
return (self[key] as? Bool) ?? fall
}
}
如果您使用像
键:StringLiteralConvertible
这样的约束声明扩展名
,在您的方法中,
声明对我来说是多余的,因为键
类型已经满足了这一点。我同意,但是键
应该是什么类型?简单地删除T
到StringLiteralConvertible
的构象是没有帮助的,显式地String
制作key也没有帮助。您可以将其声明为key
也尝试过了。。。我从非协议、非类类型的“Key”中得到了继承
为什么要对Key类型设置约束?好吧,它是有效的,所以首先谢谢你。但是为了我的教育,既然Key
不是一种类型,而是某种协议,Key
怎么可能是Key
类型呢?或者Key
被认为是一种类型吗?@AvielGrossKey
是一种必须采用hashable的类型protocol@AvielGross:Swift字典定义为public struct dictionary{…}
,因此Key
是键类型的类型占位符。
extension Dictionary where Value: AnyObject {
func boolOr(fall: Bool, key: Key) -> Bool {
return (self[key] as? Bool) ?? fall
}
}