Swift泛型函子无法将类型的值转换为预期的参数类型 [英] Swift generic func cannot convert value of type to expected argument type

查看:95
本文介绍了Swift泛型函子无法将类型的值转换为预期的参数类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试创建通用函数

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

    }

所以第一部分效果很好:

So first part works good:

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的构造方式:

This is how func is constructed:

public func importUniqueObjects<D: ImportableUniqueObject, S: Sequence>(
        _ into: Into<D>,
        sourceArray: S,
        preProcess: @escaping (_ mapping: [D.UniqueIDType: D.ImportSource]) throws -> [D.UniqueIDType: D.ImportSource] = { $0 }) throws -> [D] where S.Iterator.Element == D.ImportSource {

推荐答案

那是编译器错误. Xcode 10发布时遇到了相同的问题. 将您的方法调整为以下内容:

That's a compiler bug. Had the same issue when Xcode 10 came out. Adapt your method to the following:

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)
}

尽管我建议在导入时不要强行尝试.

Though I recommend do not do force-try when importing.

另请参见: https://bugs.swift.org/browse/SR-8945

这篇关于Swift泛型函子无法将类型的值转换为预期的参数类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆