Swift 通用函数无法将类型的值转换为预期的参数类型
Swift generic func cannot convert value of type to expected argument type
我尝试创建通用函数
func importArray<T: ImportableUniqueObject>(from exercisesDict: [[String: Any]], transaction: BaseDataTransaction) -> [T] {
if let managedObject = try? transaction.fetchOne(From<T>()){
transaction.delete(managedObject)
}
let managedObjects = try! transaction.importUniqueObjects(
Into<T>(),
sourceArray: jsonObjects)
return managedObjects
}
所以第一部分效果不错:
if let managedObject = try? transaction.fetchOne(From<T>()){
,但第二个不起作用:
let managedObjects = try! transaction.importUniqueObjects(
Into<T>(),
sourceArray: jsonObjects)
编译器说
Cannot convert value of type 'Into<T>' to expected argument type 'Into<_>'
func 是这样构造的:
public func importUniqueObjects<D: ImportableUniqueObject, S: Sequence>(
_ into: Into<D>,
sourceArray: S,
preProcess: @escaping (_ mapping: [D.UniqueIDType: D.ImportSource]) throws -> [D.UniqueIDType: D.ImportSource] = { [=15=] }) throws -> [D] where S.Iterator.Element == D.ImportSource {
这是一个编译器错误。当 Xcode 10 出来时有同样的问题。
根据以下内容调整您的方法:
func importArray<T: ImportableUniqueObject>(from exercisesDict: [[String: Any]], transaction: BaseDataTransaction) -> [T] where T.ImportSource == [String: Any] {
let managedObjects = try? transaction.importUniqueObjects(Into<T>(), sourceArray: jsonObjects)
}
虽然我建议在导入时不要强制尝试。
我尝试创建通用函数
func importArray<T: ImportableUniqueObject>(from exercisesDict: [[String: Any]], transaction: BaseDataTransaction) -> [T] {
if let managedObject = try? transaction.fetchOne(From<T>()){
transaction.delete(managedObject)
}
let managedObjects = try! transaction.importUniqueObjects(
Into<T>(),
sourceArray: jsonObjects)
return managedObjects
}
所以第一部分效果不错:
if let managedObject = try? transaction.fetchOne(From<T>()){
,但第二个不起作用:
let managedObjects = try! transaction.importUniqueObjects(
Into<T>(),
sourceArray: jsonObjects)
编译器说
Cannot convert value of type 'Into<T>' to expected argument type 'Into<_>'
func 是这样构造的:
public func importUniqueObjects<D: ImportableUniqueObject, S: Sequence>(
_ into: Into<D>,
sourceArray: S,
preProcess: @escaping (_ mapping: [D.UniqueIDType: D.ImportSource]) throws -> [D.UniqueIDType: D.ImportSource] = { [=15=] }) throws -> [D] where S.Iterator.Element == D.ImportSource {
这是一个编译器错误。当 Xcode 10 出来时有同样的问题。 根据以下内容调整您的方法:
func importArray<T: ImportableUniqueObject>(from exercisesDict: [[String: Any]], transaction: BaseDataTransaction) -> [T] where T.ImportSource == [String: Any] {
let managedObjects = try? transaction.importUniqueObjects(Into<T>(), sourceArray: jsonObjects)
}
虽然我建议在导入时不要强制尝试。