通用方法导致 "cannot pass immutable value of type AnyObject? as inout argument"
Generic method causes "cannot pass immutable value of type AnyObject? as inout argument"
我正在开发 Swift 版本的钥匙串包装器 class。我有点困惑为什么会这样:
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
}
我认为错误是 SecItemCopyMatching
可能会尝试将 AnyObject
类型的任何东西(即任何东西)分配给 result
。然而,在第二个例子中 result
不一定是 AnyObject
类型;它是某种特定类型 T
,是 AnyObject
的子类。因此,SecItemCopyMatching
可能无法正确设置result
。例如,如果 T
是 Int
,但是 SecItemCopyMatching
想将 result
设置为 String
怎么办?当 result
是 AnyObject
类型时,这不再是问题。
我正在开发 Swift 版本的钥匙串包装器 class。我有点困惑为什么会这样:
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
}
我认为错误是 SecItemCopyMatching
可能会尝试将 AnyObject
类型的任何东西(即任何东西)分配给 result
。然而,在第二个例子中 result
不一定是 AnyObject
类型;它是某种特定类型 T
,是 AnyObject
的子类。因此,SecItemCopyMatching
可能无法正确设置result
。例如,如果 T
是 Int
,但是 SecItemCopyMatching
想将 result
设置为 String
怎么办?当 result
是 AnyObject
类型时,这不再是问题。