2016-11-18 1 views
1

У меня есть массив, который может содержать до 4 значений. Массив всегда будет иметь как минимум 1 значение, а другое 3 может быть равно нулю. Я должен взять элементы внутри массива и присвоить их свойствам класса.Swift iOS -Получить словарь для принятия значения nil

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

Мне нужен словарь, чтобы принимать значения с цветами и игнорировать значения nil. Поэтому у меня есть 2 проблемы.

  1. цвета из массива, которые существуют придумывают, как ноль в myDict
  2. Ниль значения в массиве исключения

Как бы идти о фиксации этого?

код:

class ColorClass{ 
    var colorOne:String? 
    var colorTwo:String? 
    var colorThree:String? 
    var colorFour:String? 
} 

let colorClass = ColorClass() 
var randColors: [String?] = [] 

//In this case I have 2 colors but sometimes randColors may have 1 color or 3 colors or 4 colors. It will always vary 
randColors = ["purple","pink"] 

for (index,element) in randColors.enumerate(){ 

    switch index { 
    case 0: 
     if let elZero = element{ 
      colorClass.colorOne = elZero 
     } 
    case 1: 
     if let elOne = element{ 
      colorClass.colorTwo = elOne 
     } 
    case 2: 
     if let elTwo = element{ 
      colorClass.colorThree = elTwo 
     } 
    case 3: 
     if let elThree = element{ 
      colorClass.colorFour = elThree 
     } 
    default: 
     break 
    } 
} 

var myDict = [String:AnyObject]() 
myDict.updateValue(colorClass.colorOne!, forKey: "firstKey") 
myDict.updateValue(colorClass.colorTwo!, forKey: "secondKey") 
myDict.updateValue(colorClass.colorThree!, forKey: "thirdKey") 
myDict.updateValue(colorClass.colorFour!, forKey: "fourthKey") 

Аварии происходят на:

myDict.updateValue(colorClass.colorThree!, forKey: "thirdKey") 
myDict.updateValue(colorClass.colorFour!, forKey: "fourthKey") 
+0

Объекты типа '[String: AnyObject] 'не может иметь значения' nil' внутри. Однако '[String: AnyObject?]' Может. Поэтому попробуйте изменить подпись myDict, поэтому он выглядит как «var myDict = [String: AnyObject?]()» ... тогда, если вам это нужно как ниль, вы можете просто написать 'myDict.updateValue (nil, forKey: «yourKey») ' – mutantkeyboard

+0

@ мутантная клавиатура Спасибо за помощь. Я попробовал ваше решение, но оно не сработало. Я изменил объявление dict на var myDict = [String: AnyObject?](). Кроме того, я просто понял, что 2 значения цвета, которые действительно существуют, отображаются как значения nil. –

+0

Значение «nil» в словаре означает, что соответствующий ключ отсутствует. Объявление '[String: AnyObject?]' Нонсенс. – vadian

ответ

2

Использование if let игнорировать nil значения при добавлении/обновлении значений в словаре.

if let clrThree = colorClass.colorThree { 
    myDict.updateValue(clrThree, forKey: "thirdKey") 
} 

if let clrFour = colorClass.colorFour { 
    myDict.updateValue(clrFour, forKey: "fourthKey") 
} 

Причина Сбои есть, вы используете ! после colorClass.colorFour т.е. вы используете в качестве colorClass.colorFour!.

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

+0

Спасибо. Я попытался поместить его в свой оператор switch, но я получаю все значения nil даже для правильных цветов, например thiscasecase: if let elZero = someClass.propertyOne { myDict.updateValue (elZero, forKey: "firstKey") } и случай 3: , если позволить elThree = someClass.propertyFour { myDict.updateValue (elThree, forKey: "fourthKey") } производит пусть colorOne = someClass.propertyOne (значение ноль) пусть colorThree = someClass.propertyThree (Ni значения) , Я не получаю никаких сбоев, но оба значения nil и colorOne не должны быть nil –

+0

Хороший ответ. Два других варианта включают использование оператора nil coalesce и использование нового значения по умолчанию для словаря, чтобы избежать проблемы. –

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