Swift не удалось преобразовать значение NSDictionaryM в NSData

#swift #nsdictionary

#swift #nsdictionary

Вопрос:

 Output:    
({
    "Client Characteristic Configuration" = <41424344 45463132 31323334 35363738 45324441>;
})

Code : 
print("localName4", localName4)

if (localName4 != nil) {
    print("exists")

    if localName4 is Dictionary<AnyHashable,Any> {
        print("Yes, it's a Dictionary")

        do {
            if let jsonResult = try JSONSerialization.jsonObject(with: localName4 as! Data, options: []) as? NSDictionary {
                print(jsonResult)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }
}
  

Я пытаюсь получить значение <41424344 45463132 31323334 35363738 45324441> из результата. Когда я пытаюсь проанализировать значение, возникает исключение:

Не удалось преобразовать значение типа ‘NSDictionaryM’ в ‘NSData’

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

1. Что вы пытаетесь заархивировать? localName4 уже есть словарь, и вы пытаетесь преобразовать dict в Data , а затем через JSONSerialization обратно в словарь?

2. я пытаюсь получить <41424344 45463132 31323334 35363738 45324441> значение

3. Что именно «Вывод»? С какого принта оно взято?

4. функция centralManager(_ central: CBCentralManager, обнаружила периферийное устройство: CBPeripheral, advertisementData: [Строка: любая], rssi RSSI: NSNumber){ пусть localName4 = advertisementData[CBAdvertisementDataServiceDataKey] }

5. localName4 является (NS)Data объектом, а не (NS)Dictionary . Это ожидаемое поведение (оно есть в документе CBAdvertisementDataServiceDataKey ). Я не понимаю, чего вы хотите (почему JSON?)? Ваш код не имеет смысла.

Ответ №1:

Нет необходимости приводить его к Data и сериализовывать обратно в Dictionary . Чтобы получить доступ к значениям из словарей, просто вызовите их по ключу:

 let configuration = localName4["Client Characteristic Configuration"]
  

Если тип объявления localName4 не [AnyHashable : Any] , измените объявление, если это возможно, или приведите его следующим образом:

 if let dict = localName4 as? [AnyHashable : Any] {
    let configuration = dict["Client Characteristic Configuration"]
    ...
}
  

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

1. при печати конфигурации я получаю нулевое значение

2. конфигурация [AnyHashable (конфигурация, характерная для клиента): <41424344 45463132 31323334 35363738 45324441>] получил это значение при печати dict

3. Можете ли вы заменить AnyHashable на String ?

4. если блок выполнения условия не вызывается

5. Хорошо, теперь вам нужно выяснить, к какому типу относится ключ. Потому что это не строка. Распечатать результат type(of: localName4) или даже выполнить итерацию по ключам с Array(localName4.keys).forEach({ print("(type(of: $0))") })