так как я обновляю xcode 10.1, возникает эта ошибка.
Код:
class mainPageJobObj {
var _id : String = ""
var avatar :String = ""
var name : String = ""
var serviceState = ""
}
items : [mainPageJobObj]!
items // i read it from server and its not empty
let oneItem = items[index] // Fatal error: NSArray element failed to match the Swift Array Element type -- This is what compiler is showing.
ReadItemsFromServer()
не возвращает массив mainPageJobObj
здесь.
на самом деле я читал его с сервера раньше, и я не использую этот класс, но для простоты я поместил этот класс в объявление. я отлаживаю его, и он не пустой!
На скриншоте отладки видно, что items
— это массив словарей, а не массив mainPageJobObj
очень трудно понять проблему, когда вы публикуете только фрагменты своего кода.
@JoakimDanielson, я добавляю еще одну картинку, чтобы быть более конкретным, как вы можете видеть на моей второй картинке, она не пустая и не dic!
Когда вы печатаете type(of: items)
, он говорит, что это [mainPageJobObj]
, потому что именно так вы объявили его для Swift, но, когда Swift пытается получить доступ к элементу, он находит NSMutableArray
, и вы получаете исключение. type(of:)
показывает тип Swift, а не фактическое содержимое моста NSArray
Я не понимаю, что вы хотите сказать с помощью debuging more specefic
. Результат того, что type(of: items)
является Array<mainPageJobObj>
, не означает, что его фактическое содержимое равно mainPageJobObj
. На самом деле, это несоответствие вызывает ошибку. Если вы не покажете, как вы получаете items
(slider_mainPageObj.items
), вам, возможно, придется прочитать еще много бесполезных догадок.
Об этом уже говорили другие, но я все равно это делаю. 1. вы объявляете переменную массивом определенного типа. 2. вы присваиваете своей переменной массив другого типа (словарь). 3. вы пытаетесь прочитать из своей переменной массива, и здесь вы сталкиваетесь с последствиями пунктов 1 и 2.
@ Надя, ты уже нашла ответ или нет? После обновления?
@HarjotSingh нет, еще не знал, но обнаружил, что проблема не связана с обновлением xcode.
@ Надя, ты пробовала ответить мистеру Полу? Он дает очень хорошее решение, чтобы преодолеть это с самого начала.
@HarjotSingh да, он был прав, проблема была в типе массива, преобразователь работал неправильно. Я чиню это
@ Надя, как ты это исправила, пожалуйста, поделись? или Опубликовать как свой собственный ответ?
@HarjotSingh Я использую Alamofire для преобразования строки json (которая читается с сервера) в мой пользовательский объект, я не знал, что произошло, вдруг преобразование не работает, как вы можете видеть на картинке, тип массива в мой объект - NSDictionary, которого не должно быть. я просто опускаюсь в расширение своего проекта git, где оно работает хорошо, и теперь я продолжаю развивать свой проект.
Сообщение об ошибке сообщает вам, что items
был соединен с NSArray
(что не требует ввода его элементов), но когда Swift попытался получить элемент, он не нашел экземпляр mainPageJobObj
, который, как вы сказали, содержится в их массиве.
На снимке экрана отладки видно, что массив items
на самом деле содержит экземпляры NSMutableDictionary
.
Быстрое решение — использовать соответствующее объявление items
:
var items:[String:Any] = slider.mainPageObj.items!
let oneItem = items[index]
let name = oneItem["name"]
Гораздо лучшее решение — использовать типы Swift с самого начала; Если данные с вашего сервера возвращаются в формате JSON, используйте Codable
для создания экземпляров Swift Struct или Class.
данные с сервера анализируются из dic в [mainPageJobObj] с помощью EVReflection (github.com/evermeer/EVReflection), я хочу, чтобы тип элементов был [mainPageJobObj], а не dic! это работает до обновления xcode!
Я ничего не знаю о EVReflection
или о том, что могло измениться. Вас неоднократно просили показать код, который извлекает ваши данные и создает массив. Что я могу вам сказать, так это то, что у вас есть множество словарей, и это вызывает ваш сбой. Кстати, Xcode 10.2 уже выпущен
чувак, ты точно спас меня! с обновлением до xcode 12.4 у меня была аналогичная проблема с MLVision, но ваш подход был отличным решением.
Короткий ответ:
items
не содержит экземпляровmainPageJobObj
. Вам нужно показатьreadItemsFromServer
для лучшего ответа