Не удается преобразовать [SubclassOfErrorType] в ожидаемый тип [ErrorType]

#ios #swift #polymorphism #nserror

#iOS #swift #полиморфизм #ошибка nserror

Вопрос:

У меня есть обычай ErrorType , как показано ниже:

 struct RGOServerValidationChallenge: ErrorType {
    var message: String
    var fieldIdentifier: String

    init(message: String, fieldId: String) {
        self.message = message
        self.fieldIdentifier = fieldId
    }
}
  

И перечисление для представления результата, который я получаю от своих вызовов API, будь то успех или сбой:

 enum RGOResult {
    case Success(AnyObject?)
    case Failures([ErrorType])
}
  

Как вы можете видеть Failures , случай принимает аргумент массива ErrorType .

Однако, когда я пытаюсь передать массив RGOServerValidationChallenge в это перечисление, компилятор выдает следующую ошибку:

Cannot convert value of type '[RGOServerValidationChallenge]' to expected argument type '[ErrorType]' .

Я не уверен, почему это происходит, поскольку RGOServerValidationChallenge является дочерним объектом ErrorType so полиморфизм должен позволять мне передавать значение без приведения.

Редактировать:

Я создал случайный протокол в том же файле и сделал RGOServerValidationChallenge его соответствующим ему вместо ErrorType . Затем я отредактировал RGOResult.Failures , чтобы использовать этот новый протокол в качестве аргумента. Ошибка по-прежнему сохраняется, что говорит о том, что проблема не в ErrorType этом.

РЕДАКТИРОВАТЬ 2:

Интересно, [RGOServerValidationChallenge] что прямая передача объекта работает, но при использовании переменной это не так. Я имею в виду:

Это работает:

 let errors = RGOResult.Failures([RGOServerValidationChallenge(message: "", fieldId: "")])
  

Это не:

 let arr = [RGOServerValidationChallenge(message: "", fieldId: "")]
let errors = RGOResult.Failures(arr)
  

Я совершенно в тупике…

РЕДАКТИРОВАТЬ 3:

Я только что запустил это на игровой площадке Swift 3, как предложил Винс, и, похоже, это работает. Я думаю, это должна быть просто ошибка Swift, которая была исправлена в Swift 3. Похоже, мне просто придется сделать решительный шаг и обновить свою базу кода.

Комментарии:

1. Странно. Работает для меня в Swift 3, когда я вырезаю и вставляю ваш код в игровую площадку и объявляю ErrorType как протокол. В какой версии Swift вы кодируете?

2. Я использую Swift версии 2.3

3. Это странно, попробовал это на игровой площадке 2.3, и все в порядке.