Получение __NSArray0 от JWT

#arrays #swift #jwt #token

Вопрос:

У меня есть api, который создает JWT для вошедшего в систему пользователя, и когда я смотрю на декодированную версию токена на jwt.io Я получаю то, что ожидаю.

Это показывает, что свойство data является [] и содержит данные пользователей, когда пользователь вошел в систему.

Теперь я пытаюсь расшифровать это в swift для моего приложения iOS, но данные в свойстве data возвращаются в виде:

 ( )  

и тип для этого __NSArray0

Я не могу просмотреть его или что — то в этом роде-что такое a __NSArray0 и как правильно декодировать токен?

Комментарии:

1. __NSArray0 означает a NSArray , которое является специфичным, потому что оно имеет нулевой элемент. Он неизменен и оптимизирован, вот почему в нем ничего не говорится 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: []