2016-02-08 1 views
0

Это то, что я пытаюсь сделать со словарем:Как использовать словарь в Swift для родственного типа?

if let deliveries = dictionary["deliveries"] as? NSDictionary { 

     var castedDeliveries = [Double: Double]() 

     for delivery in deliveries { 

      if let value = delivery.value as? Double { 
       castedDeliveries[Double(delivery.key as! NSNumber)] = value //Could not cast value of type 'NSTaggedPointerString' (0x1a1e3af20) to 'NSNumber' (0x1a1e458b0). 
      } 
     } 
     settings!.deliveries = castedDeliveries 
    } 

И это то, что я пытаюсь бросить, как часть ответа JSON от сервера:

deliveries =   { 
    2 = 0; 
    5 = "2.59"; 
    7 = "3.59"; 
}; 

Это не работает, потому что ошибка в строке комментировал:

не удалось бросить значение типа 'NSTaggedPointerString' (0x1a1e3af20) к 'NSNumber' (0x1a1e458b0).

+2

Очевидно, что код не попадает внутрь 'if', потому что' dictionary ["deliveries"] 'is * not * a' [Double: Double] '. Передайте его любому типу, который на самом деле есть, затем сделайте копию, в которой каждая пара ключей/значений будет индивидуально выполняться. – dasblinkenlight

+0

Нет, следующие работы: 'castedDeliveries [(delivery.key as! NSString) .doubleValue] = значение' Я не знаю почему. –

+2

Указатель Taggaed - это еще одна проблема, это особый вид переменной, которая вместо указания на определенный объект в памяти содержит самую информацию. Но я думаю, что ваш подход слишком запутан. Сначала поймите тип данных, возвращаемых из операции разбора JSON, во-вторых, попробуйте понять, что нужно сделать, сделайте это шаг за шагом – Andrea

ответ

0

Вы пытаетесь использовать словарь напрямую, но вместо этого вам нужно указать каждую пару ключей. Если вы хотите получить общее решение этой проблемы, ознакомьтесь с библиотекой SwiftyJSON, в которой вам будет рассмотрена проблема синтаксического анализа JSON.

0

Кастинг не означает преобразование данных из одного типа в другой.
Ваш словарь, кажется, состоит из Integer ключей и String значений.
Если вы хотите преобразовать что-то еще, используйте функцию карты.

let converted = deliveries.map{[Double($0) : Double($1)]} 

Но обратите внимание.
Здесь мы говорим, что итерация по словарю (в $ 0 есть ключ словаря в $ 1 есть значение) и создайте новый словарь, который имеет в качестве ключа Double, инициализированный значением ключа, и как новое значение a Double инициализируется как значение старого словаря. Последнее преобразование может завершиться неудачно, поэтому возвращаемые данные являются необязательными.

+0

что именно «поставки» в вашем ответе? –

0

Как я уже отмечал в комментариях, это не литье. Вы хотите преобразование данных. Вам нужно сделать это явно, особенно в этом случае, так как это может привести к ошибке.

Глядя на ошибку, я думаю, что у вас действительно есть словарь [String:String] здесь (в форме NSDictionary). Это говорит о том, что JSON плохо кодируется, но такова жизнь. Если предположить, что dictionary выглядит примерно так:

let dictionary: NSDictionary = ["deliveries": ["2":"0", "5": "2.59", "7": "3.59"]] 

Вы бы преобразовать его в [Double:Double] так:

if let jsonDeliveries = dictionary["deliveries"] as? [String:String] { 
    var deliveries: [Double: Double] = [:] 
    for (key, value) in jsonDeliveries { 
     if let keyDouble = Double(key), 
      valueDouble = Double(value) { 
       deliveries[keyDouble] = valueDouble 
     } 
    } 
    // Use deliveries 
} 

Это молча игнорирует любые значения, которые не могут быть преобразованы в два раза. Если вы предпочитаете генерировать ошибки, используйте guard let, а не if let.

Смежные вопросы