Общая функция -> Невозможно преобразовать возвращаемое выражение в возвращаемый тип - PullRequest
0 голосов
/ 09 февраля 2019

Вот небольшая проблема с использованием универсальной функции.Вероятно, основная ошибка из-за отсутствия практики с дженериками.В любом случае, ниже приведен код, относящийся к вопросу.

Сама универсальная функция, не показывающая ошибок:

func setThingRevision<GenericType:Revisionable>(entity name: String) -> [(GenericType,Int)] {
    var resultArray = [(GenericType,Int)]()
    // ..... we do some useful magic ......
    return resultArray
}

Некоторые коды, использующие универсальную функцию выше:

func setMyRealStuffRevision(entity name: String) -> [(RealType,Int)] {
    return setThingRevision(entity: name)
}

Вот сообщение об ошибке, выданное компилятором в последней функции (setMyRealStuffRevision):

Cannot convert return expression of type '[(_, Int)]' to return type '[(RealType, Int)]'

Вместо того, чтобы быть удивленным сообщением, Интересно, какой синтаксис использовать.

My RealType совместим с GenericType , но я не уверен, нужно ли мне предоставлять некоторую информацию для универсальной функции setThingRevision или можно сделать выводиз контекста.

--- Дополнение ---

Вот подделка setThingRevision , которую я создал для целей тестирования.

func setThingRevision<GenericType:Revisionable>(entity name: String) -> [(GenericType,Int)] {
    var resultArray = [(GenericType,Int)]()

    // Here name contains the name of a Core Data entity and getArrayFromEntity is
    // a local function, extracting an array from the contents of the entity.
    for item in getArrayFromEntity(name) as! [GenericType] {
        resultArray.append((item, 99))
        return resultArray
    }

    return resultArray
}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

попробуйте

func setThingRevision<T: Revisionable>(entity name: String) -> [(T, Int)] {
    var resultArray = [(T, Int)]()
    // ..... we do some useful magic ......
    return resultArray
}

func setMyRealStuffRevision(entity name: String) -> [(RealType, Int)] {
    return setThingRevision(entity: name)
}

protocol Revisionable {
}

// edited
class RealType: NSManagedObject, Revisionable  {
}
0 голосов
/ 09 февраля 2019

На безопасных для типов языках, если «индуцированное» преобразование не может быть выполнено, компилятор сообщит вам это сообщение.Каким-то образом 'var resultArray = (GenericType, Int)' не интерпретируется как тип, который можно преобразовать в тип возвращаемой функции.Внимательно изучите тип resultArray, назначенный компилятором.Правильный синтаксис для использования не будет использовать 'var' для создания переменной resultArray, вместо этого явно определите тип.

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