2015-06-20 11 views
-1

Я довольно новый для быстрых и я пытаюсь понять, как иметь дело с нулевыми переменными ...Как безопасно разворачивать значения nil в swift?

У меня есть два словаря:

var currencyname: NSDictionary = [ 
     "CNY": "Chinese Yuan", 
     "PLN": "Polish Zloty" 
     "EUR": "Euro" 
] 

var rawrates NSDictionary = [ 
     "CNY": "1.34", 
     "PLN": "1.456" 
] 

Я совмещая их с помощью словаря кортежей:

var combinedDictionary:[String:(name:String,rate:String)] = [:] 

for key in currencyname.keys.array { 
    combinedDictionary[key] = (currencyname[key]!,rawrates[key]!) 
} 

Однако я получаю ошибку found nil while unwrapping an Optional value с ключом EUR в currencyname словарь не соответствует любой клавиши в rawrate словаре.

Я понимаю, что мне нужно как-то проверить, что ключ существует в обоих словарях, прежде чем объединять их с помощью let if? Но я смущен относительно синтаксиса ... Я также попытался использовать необязательные значения без успеха.

Так что мой вопрос: как я могу объединить эти два словаря и оставить вне EUR из объединенного словаря, поскольку в словаре rawrate нет соответствующего ключа?

Благодарим за помощь!

+0

«У меня есть два массива» Нет, у вас есть два словаря. Вы не получите _anywhere_ до тех пор, пока не получите _that_ прямо. – matt

+0

К сожалению, вы правы! Я отредактировал мой вопрос – anto0522

+0

Я думаю, вы должны остановиться и четко заявить, для себя и для нас, что вы хотите, чтобы конечный результат выглядел. Вы, кажется, не знаете, чего хотите, поэтому у вас нет возможности добраться туда, если вы понимаете, что я имею в виду. – matt

ответ

1

Я думаю, что вы после этого что-то вроде этого:

let currencyname = [ 
     "CNY": "Chinese Yuan", 
     "PLN": "Polish Zloty", 
     "EUR": "Euro" 
    ] 

    let rawrates = [ 
     "CNY": "1.34", 
     "PLN": "1.456" 
    ] 

    var combinedDictionary = [String:(name:String,rate:String)]() 
    for key in currencyname.keys { 
     if let val1 = currencyname[key], val2 = rawrates[key] { 
      combinedDictionary[key] = (val1,val2) 
     } 
    } 

Но это немного трудно быть уверенным, без четкой постановки задачи. Это не то, что я бы посоветовал в любом случае. Мне кажется, что это лучший результат:

let currencyname = [ 
    "CNY": "Chinese Yuan", 
    "PLN": "Polish Zloty", 
    "EUR": "Euro" 
] 

let rawrates = [ 
    "CNY": "1.34", 
    "PLN": "1.456" 
] 

struct Currency { 
    let name : String 
    let rate : String 
} 

var combinedDictionary = [String:Currency]() 
for key in currencyname.keys { 
    if let val1 = currencyname[key], val2 = rawrates[key] { 
     combinedDictionary[key] = Currency(name:val1, rate:val2) 
    } 
} 
+0

Спасибо, что работает. Я уверен, что моя проблема была указана, вероятно, так: «Итак, мой вопрос: как я мог бы объединить эти два словаря и оставить EUR комбинированного словаря, поскольку в словаре rawrate нет соответствующего ключа?» – anto0522

+0

@ anto0522 Почему бы не попробовать использовать мой ответ на ваш предыдущий вопрос, который очень похож на ответ мата здесь, но с тонкой разницей. http://stackoverflow.com/a/30948414/2792531 – nhgrif

+0

@nhgrif Привет! Я действительно использовал ваш ответ. Этот вопрос состоял в том, как обрезать значения nil с выражением «if let», я просто использовал пример, который я использовал ранее, чтобы проиллюстрировать мою проблему ... Я не был уверен, что попросить мой предыдущий вопрос или создать новый один, поэтому я пошел с созданием нового ... – anto0522