通用方法导致“无法传递AnyObject类型的不可变值?作为inout参数”

时间:2016-05-20 01:58:02

标签: swift generics immutability anyobject

我正在开发一个Swift版本的Keychain包装器类。我有点困惑为什么会这样:

private func executeFetch(query: KeyStoreObject) throws -> AnyObject? {
    var result: AnyObject?
    try executeQuery(query) { SecItemCopyMatching(query.data, &result) }
    return result
}

这不是:

private func executeFetch<T: AnyObject>(query: KeyStoreObject) throws -> T? {
    var result: T?
    try executeQuery(query) { SecItemCopyMatching(query.data, &result) }
    return result
}

1 个答案:

答案 0 :(得分:0)

我认为错误是SecItemCopyMatching可能会尝试将AnyObject类型的任何内容(即任何内容)分配给result。但是,在第二个示例中,result不一定是AnyObject类型;它是某种特定类型T,它是AnyObject的子类。因此,SecItemCopyMatching可能无法正确设置result。例如,如果TInt,但SecItemCopyMatching想要将result设置为String,该怎么办?当result类型为AnyObject时,这不再是问题。