2015-01-05 4 views
0

Я пытаюсь петля через (как я бы истолковать) массив, arrayname.count как:«AnyObject?» не имеет элемента с именем «счетчик»

if var storedToDoItems: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("toDoItems") { 
     toDoItems = [] 

     for var i = 0; storedToDoItems.count; i++ { 
      toDoItems.append(storedToDoItems[i] as NSString) 
     } 
    } 

и получить ошибку в названии отмеченного storedToDoItems.count. Я заселение первый storedToDoItems как это:

... 
    toDoItems.append(tb_toDoItem.text) 

    let fixedToDoItems = toDoItems 

    // Store items 
    NSUserDefaults.standardUserDefaults().setObject(fixedToDoItems, forKey: "toDoItems") 

    // Save the stored stuff 
    NSUserDefaults.standardUserDefaults().synchronize() 
... 

ответ

1

Если массив хранится на значения по умолчанию пользователя , вы должны попытаться применить его к массиву при его извлечении.

Если toDoItems определяется как массив строк [String], то вы просто должны использовать опциональный связывание в сочетании с дополнительным гипсе, а просто скопировать извлеченный массив toDoItems:

if let storedToDoItems: [String] = NSUserDefaults.standardUserDefaults().objectForKey("toDoItems") as? [String] { 
    toDoItems = storedToDoItems 
} 

Будучи массивом на структуру, т.е. тип значения, он присваивается копией, поэтому при назначении storedToDoItems на toDoItems его копия создается и назначается - поэтому вам не нужно вручную добавлять каждый элемент отдельно.

Ваш код вместо этого имеет 2 ошибки:

  • вы определили storedToDoItems в качестве необязательного AnyObject и OPTIONALS не имеет count свойства.
  • , даже если он не является опционным, AnyObject не имеет также count. Не имеет значения, что фактический тип, хранящийся в переменной, является массивом, переменная объявляется как AnyObject, и именно так обрабатывается компилятором.
+0

Спасибо вам, ребята, настолько легки и не нужны петли! Большое спасибо – kesa

0

Вы должны сказать, что внутри:

toDoItems = [String]() 
if let storedToDoItems = NSUserDefaults.standardUserDefaults().objectForKey("toDoItems") as? [String] { 
    for item in storedToDoItems { 
     toDoItems.append(item) 
    } 
} 

и даже короче:

toDoItems = [String]() 
if let storedToDoItems = NSUserDefaults.standardUserDefaults().objectForKey("toDoItems") as? [String] { 
    toDoItems = storedToDoItems 
} 
+0

Первая из них была «исправленной» версией кода OP, касающейся деклараций. Второй будет правильным. Инициализация необходима, поскольку после того, как она либо пуста, либо (если она есть), содержит значения по умолчанию пользователя. В качестве альтернативы можно было бы разместить пустое присваивание в инструкции else. Так или иначе. это не внутри тяжелой петли, и поэтому производительность здесь не представляет никакого интереса. –

0

Я просто использовал этот Жирный линия будет работать для вас, надеюсь,

если вар toDoStored: [String] = NSUserDefaults.standardUserDefaults() objectForKey ("toDoSaved"), как.? [String] {

  tblItems = [] 

     for var i = 0; i < toDoStored.count ; ++i { 
     tblItems.append(toDoStored[i] as NSString) 
     } 

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