Комментарии 6
Работа со строками — извечная боль для любого программиста. Интересно, а как в swift'е обстоят дела со слайсами строк? По идеи если исходная строка не будет удаляться из памяти, то нам достаточно иерархию объекта сделать поверх слайсов, а не создавать новые строки и копировать данные туда, при этом и код не должен получится страшным.
0
SwiftyJSON популярный, но очень не эффективный — habrahabr.ru/post/270063/#comment_8641347
Вариант из той статьи работает значительно лучше. Используя его, в принципе в большинстве задач, можно вообще json не перегонять в другой формат, а работать с ним как есть:
Вариант из той статьи работает значительно лучше. Используя его, в принципе в большинстве задач, можно вообще json не перегонять в другой формат, а работать с ним как есть:
let obj = json?["workplan"]?["presets"]?[1]?["id"] as? Int
0
Можно, хотя в данном примере если в массиве presets не найдется элемента с индексом 1 то будет исключение.
И вот так работает быстрее, хотя объяснений у меня этому нет:
И вот так работает быстрее, хотя объяснений у меня этому нет:
let obj = (json?["workplan"]?["presets"]?[1]?["id"] as? NSNumber)?.integerValue
0
Вроде не должно, так как там optional chaining то будет nil
Проверил
let jsonData = "{\"workplan\":{\"presets\":[{\"id\":0}, {\"id\":1}, {\"id\":2}]}}".dataUsingEncoding(NSUTF8StringEncoding)
let json = JSON(jsonData)
var obj = json?["workplan"]?["presets"]?[0]?["id"] as? Int
print(obj) // Optional(0)
var obj = (json?["workplan"]?["presets"]?[1]?["id"] as? NSNumber)?.integerValue
print(obj) // Optional(1)
obj = json?["workplan"]?["presets"]?[5]?["id"] as? Int
print(obj) // nil
obj = json?["foo"]?["doo"]?[543]?["q"] as? Int
print(obj) // nil
0
Как сказано ниже, исключения не будет, будет nil.
А по поводу скорости, это скорее всего потому что объекты ObjC (NSDictionary, NSArray) это не тоже самое что объекты Swift (Dictionary<Key, Value>, Array) И класс NSJSONSerialization выдает результат тоже Objc формате, и класс разбора по ссылке внутри себя тоже делает множество неявных преобразований, поэтому казалось бы невинные операции могут быть весьма ресурсоёмкими.
Пока не будет полностью переписана стандартная библиотека (NSFoundation) специально под Swift, быстрым он так и не станет.
В этом плане использование просто сишных библиотек подключенных к Swift является более производительным решением, хоть и менее удобным. Впрочем и там можно наткнуться на грабли с преобрахованиями
А по поводу скорости, это скорее всего потому что объекты ObjC (NSDictionary, NSArray) это не тоже самое что объекты Swift (Dictionary<Key, Value>, Array) И класс NSJSONSerialization выдает результат тоже Objc формате, и класс разбора по ссылке внутри себя тоже делает множество неявных преобразований, поэтому казалось бы невинные операции могут быть весьма ресурсоёмкими.
Пока не будет полностью переписана стандартная библиотека (NSFoundation) специально под Swift, быстрым он так и не станет.
В этом плане использование просто сишных библиотек подключенных к Swift является более производительным решением, хоть и менее удобным. Впрочем и там можно наткнуться на грабли с преобрахованиями
+1
А если проверить эти решения на Objective-C интересно какая будет разница.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Быстрая работа с JSON в Swift