Pull to refresh

Comments 6

Работа со строками — извечная боль для любого программиста. Интересно, а как в swift'е обстоят дела со слайсами строк? По идеи если исходная строка не будет удаляться из памяти, то нам достаточно иерархию объекта сделать поверх слайсов, а не создавать новые строки и копировать данные туда, при этом и код не должен получится страшным.
SwiftyJSON популярный, но очень не эффективный — habrahabr.ru/post/270063/#comment_8641347
Вариант из той статьи работает значительно лучше. Используя его, в принципе в большинстве задач, можно вообще json не перегонять в другой формат, а работать с ним как есть:

let obj = json?["workplan"]?["presets"]?[1]?["id"] as? Int 

Можно, хотя в данном примере если в массиве presets не найдется элемента с индексом 1 то будет исключение.

И вот так работает быстрее, хотя объяснений у меня этому нет:

let obj = (json?["workplan"]?["presets"]?[1]?["id"] as? NSNumber)?.integerValue


Вроде не должно, так как там 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

Как сказано ниже, исключения не будет, будет nil.
А по поводу скорости, это скорее всего потому что объекты ObjC (NSDictionary, NSArray) это не тоже самое что объекты Swift (Dictionary<Key, Value>, Array) И класс NSJSONSerialization выдает результат тоже Objc формате, и класс разбора по ссылке внутри себя тоже делает множество неявных преобразований, поэтому казалось бы невинные операции могут быть весьма ресурсоёмкими.
Пока не будет полностью переписана стандартная библиотека (NSFoundation) специально под Swift, быстрым он так и не станет.
В этом плане использование просто сишных библиотек подключенных к Swift является более производительным решением, хоть и менее удобным. Впрочем и там можно наткнуться на грабли с преобрахованиями
А если проверить эти решения на Objective-C интересно какая будет разница.
Sign up to leave a comment.

Articles