Swift2:为什么';这个字典扩展不编译吗?

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

Xcode7抛出:

无法为“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
被认为是一种类型吗?@AvielGross
Key
是一种必须采用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
    }
}