Универсальный функционал Swift не может преобразовать значение типа в ожидаемый тип аргумента - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать универсальный func

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] = { $0 }) throws -> [D] where S.Iterator.Element == D.ImportSource {

1 Ответ

1 голос
/ 06 мая 2019

Это ошибка компилятора. Была такая же проблема, когда 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)
}

Хотя я рекомендую не делать принудительную попытку при импорте.

Также см .: https://bugs.swift.org/browse/SR-8945

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...