#arrays #swift #jwt #token
Вопрос:
У меня есть api, который создает JWT для вошедшего в систему пользователя, и когда я смотрю на декодированную версию токена на jwt.io Я получаю то, что ожидаю.
Это показывает, что свойство data является []
и содержит данные пользователей, когда пользователь вошел в систему.
Теперь я пытаюсь расшифровать это в swift для моего приложения iOS, но данные в свойстве data возвращаются в виде:
( )
и тип для этого __NSArray0
Я не могу просмотреть его или что — то в этом роде-что такое a __NSArray0
и как правильно декодировать токен?
Комментарии:
1.
__NSArray0
означает aNSArray
, которое является специфичным, потому что оно имеет нулевой элемент. Он неизменен и оптимизирован, вот почему в нем ничего не говоритсяNSArray
. Это внутренний класс. Вы можете привести как[Any]
, или[Something]
гдеSomething
обычно находится класс объекта.
Ответ №1:
__NSArray0
:
__NSArray
означает, что это NSArray
объект. Это «старый неизменяемый тип массива Objective-C». Это то, что дает вам после декодирования массива JSON (NS)JSONSerialization
, если вы не приведете его в массив Swift.
0
В конце следует сказать , что это конкретное NSArray
, это NSArray
пустое, без объекта. Зачем это использовать? Потому что на самом деле это внутренняя версия NSArray
, оптимизированная для нулевых элементов. Так что не обращай на это внимания.
Поскольку у вас есть NSArray
типичный отпечаток этого , это:
( )
Так что просто приведите его Array
как предполагаемый тип, когда он непустой, для итерации. Если вы знаете, что это массив строк, приведите его как [String]
и повторите его.
Это формат OpenStep. Вы когда-нибудь пытались прочитать код АТС? Как more yourApp.xcodeproj/project.pbxproj
будто это там, вы видите , как печатаются NSDictionary
и т. NSArray
Д. В этом формате комментарии.
В JSON это []
должно показать, что это массив, но в Objective-C печать отличается.
Хотите воспроизвести его?
let emptyNSArray = NSArray() print("emptyNSArray:n(emptyNSArray)") let castedEmptyAsArray = emptyNSArray as [AnyObject] print("castedEmptyAsArray:n(castedEmptyAsArray)") let nsArray = NSArray(array: ["Hello", "World", "!"]) print("nsArray:n(nsArray)") let castedAsArray = nsArray as [AnyObject] print("castedAsArray:n(castedAsArray)") let emptyArrayJSON = Data("[]".utf8) let decodedEmptyArrayDefault = try! JSONSerialization.jsonObject(with: emptyArrayJSON) print("decodedEmptyArrayDefault:n(decodedEmptyArrayDefault)") //If you don't cast, it's by default a NSArray let decodedEmptyArrayCasted = try! JSONSerialization.jsonObject(with: emptyArrayJSON) as! [AnyObject] print("decodedEmptyArrayCasted:n(decodedEmptyArrayCasted)")
Выход:
$gt;emptyNSArray: ( ) $gt;castedEmptyAsArray: [] $gt;nsArray: ( Hello, World, "!" ) $gt;castedAsArray: [Hello, World, !] $gt;decodedEmptyArrayDefault: ( ) $gt;decodedEmptyArrayCasted: []