Swift2:为什么这个Dictionary扩展不编译?

时间:2015-10-20 12:29:33

标签: swift generics dictionary

Xcode7抛出:

select t.* , ttop.id as firstid from #test t JOIN #test ttop on ttop.id = (SELECT TOP 1 ID FROM #TEST tbest WHERE t.list = tbest.list order by priority) and ttop.id = t.id -- this does the trick!

我在这里缺少什么?

Cannot subscript a value of type 'Dictionary<Key,Value>' with an index of type 'T'

尝试将其设为extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { func boolOr<T:StringLiteralConvertible>(fall: Bool, key: T) -> Bool { return (self[key] as? Bool) ?? fall } } 也不起作用(我使用String而不是String得到同样的错误)

T

1 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,类型约束 在boolOr()方法上没有必要:

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    func boolOr(fall: Bool, key: Key) -> Bool {
        return (self[key] as? Bool) ?? fall
    }
}

因为密钥类型已在扩展声明中受到限制。 您的代码无法编译,因为<T:StringLiteralConvertible> 引入了一个与本地类型无关的本地类型占位符T Key字典的类型。

但实际上我不明白你为什么要对它施加约束 密钥类型:

extension Dictionary where Value: AnyObject {
    func boolOr(fall: Bool, key: Key) -> Bool {
        return (self[key] as? Bool) ?? fall
    }
}