Я не уверен, где определить проблему в этом коде
var events = [Events]()
let URL_GET_DATA = "http://192.168.100.4/PrototypeWebService/api/getevents.php"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
Alamofire.request(URL_GET_DATA).responseJSON{ response in
if let json = response.result.value {
print(json)
let swiftvar = JSON(json).array
for i in 0..<(swiftvar?.count)! {
let jsonObject = swiftvar?[i].object
self.events.append(jsonObject as! Events)
}
self.EventTable.reloadData()
}
}
}
Я ожидаю, что он создаст массив объектов типа Events, но выдает эту ошибку:
Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102ca0f4c
Ваш код неправильно использует API SwiftJSON. Виновником является линия
jsonObject as! Events
Если бы вы на самом деле писали код безопасным образом, используя as?
динамический оператор приведения вниз, компилятор с радостью сообщил бы вам, что тип Events
и тип jsonObject
являются частями отдельных иерархий типов, и поэтому приведение вниз всегда будет неудачным.
Согласно документации SwiftJSON, которую можно найти по адресу https://github.com/SwiftyJSON/SwiftyJSON, фреймворк управляет десериализацией, однако его базовый API не предоставляет никаких средств для заполнения объектов, и поэтому это задача программистов.
Скажем, тип Events
имеет 2 сохраненных свойства, let string: String
и let int: Int
.
Чтобы создать объект Events
из проанализированного объекта JSON, вам необходимо извлечь значения вручную как таковые.
let string = jsonObject["name"].string
let int = jsonObject["int"].int
а затем вы должны передать эти значения в свой собственный конструктор как таковой
let events = Events(string, int)
Только после этого у вас действительно будет объект Events, который вы сможете использовать.
Обновлено: также с момента выпуска Swift 4 существует протокол Codable
и тип JSONDecoder
, которые обеспечивают надежные, гибкие и безопасные средства для декодирования ваших полезных данных json, представленных объектом Data
, и вам, вероятно, следует отказаться от SwiftyJSON, потому что это ненужный зависимость.
Большое спасибо .. На самом деле я новичок в Swift, поэтому концепции кодирования и декодирования мне все еще чужды.
Если бы вы могли помочь мне с образцом учебника
Прежде всего, вам предлагается отказаться от SwiftyJSON
в пользу Codable
.
Ошибка возникает из-за того, что объект (Swifty)JSON не может быть приведен к пользовательской структуре или классу.
Вы должны передать значение JSON инициализатору пользовательской структуры.
struct Event { // it's highly recommended to name this kind of object in singular form
let varA : String
let varB : Int
init(json: JSON) {
self.varA = json["varA"].string ?? ""
self.varB = json["varB"].int ?? 0
}
}
И, пожалуйста, никогда не используйте циклы на основе индекса, если вам вообще не нужен индекс. Создайте экземпляр Event
из объекта JSON
и добавьте его
guard let swiftvar = JSON(json).array else { return }
for item in swiftvar {
let event = Event(json: item)
self.events.append(event)
}
или еще проще
guard let swiftvar = JSON(json).array else { return }
self.events = swiftvar.map{ Event(json: $0) }
Большое спасибо .. На самом деле я новичок в Swift, поэтому концепции кодирования и декодирования мне все еще чужды.
Если бы вы могли помочь мне с образцом учебника
Я столкнулся с ошибкой времени выполнения, которая говорит Дополнительный аргумент 'json' в вызове для обоих вариантов.
В какой строке?
Здесь: пусть событие = события (json: элемент)
Вы должны добавить (и настроить) предлагаемый метод init
в классе Event(s)
В классе событий написано Использование необъявленного типа JSON
Поскольку вы используете SwiftyJSON, в любом случае он должен быть доступен
Я решил это. Я забыл импортировать SwiftyJSON в класс событий
Готово с настройками.. Он по-прежнему показывает Дополнительный аргумент 'json' в вызове
Я не знаю, какие еще инициализаторы содержит класс. Есть ли метод init()
без параметров? Если да, удалите его
Ну, это хорошо работает со вторым вариантом, но ничего не отображает в моей таблице.
это другой вопрос
Код очень небезопасен, вы должны обернуть инициализацию неизменяемого значения
swiftvar
в предложениеif let
. Кроме того, принудительное применениеjsonObject as! Events
является возможной точкой отказа, и я действительно сомневаюсь, что это вообще можно опустить. Пожалуйста, попытайтесь написать свой код, избегая принудительного приведения типов.