#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, и все в порядке.