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