2015-04-26 3 views
1

У меня есть этот класс Identity и словарь экземпляров из них со строками в виде ключей. Я хочу получить доступ к одному из экземпляров с помощью строки и изменить некоторые ее свойства. Я пытаюсь использовать оператор switch для доступа к экземплярам в словаре в зависимости от значения строки.Словарь быстрых классов со строками

class Identity { 
    let provider: String 
    let uid: String? 
    let token: String? 
    let name: String? 

    init(provider: String){ 
     self.provider = provider 
     self.uid = nil 
     self.token = nil 
     self.name = nil 
    } 
} 

var identities = [String:Identity]() 

identities["twitter"] = Identity(provider: "twitter") 

identities["twitter"].uid = "131241241241" 

identities["twitter"].name = "@freedrull" 

let provider: String = "twitter" 

var i: Identity? { 
    switch provider { 
    case "twitter": 
     return identities["twitter"] as Identity? 
    case "facebook": 
     return identities["facebook"] as Identity? 
    case "soundcloud": 
     return identities["soundcloud"] as Identity? 
    default: 
     return nil 
    } 
} 

if i != nil { 
    i.name = "tony" 
} 

Я получаю ошибку о присвоении i.name к "Тони". Мне нужно каким-то образом отличить i? Я думал, что это уже было.

ответ

1

Вы объявили i как Факультативно:

var i: Identity? // ... 

Так что это еще Опциональный. Это не Идентичность. Это необязательная упаковка Identity. Но вы не можете сделать do что угодно, если вы не разворачиваете его. Разверните его, чтобы получить идентификацию. У вас есть:

if i != nil { 
    i.name = "tony" 
} 

Вместо:

if let i = i { 
    i.name = "tony" 
} 

Или:

if i != nil { 
    i!.name = "tony" 
} 

Оба являются способы разворачивания Факультативный.

Или, испытания и разворачивать все в один ход:

i?.name = "tony" 

Тогда вы будете иметь новую проблему; вы указали name как константу. Вы не можете изменить константу! У вас есть:

let name: String? 

Вместо:

var name: String? 

[Кстати, большая часть этого кода является излишним:

init(provider: String){ 
    self.provider = provider 
    self.uid = nil 
    self.token = nil 
    self.name = nil 
} 

uid, token и name все Optionals, поэтому они уже ноль. Вы можете вырезать эти три строки.]

+0

Я считаю, что вы также можете сделать: 'i? .name =" tony "' также без трех строк кода. – Oxcug

+0

@ theMonster Конечно, я его брошу, почему бы и нет? – matt

+0

http://www.apeth.com/swiftBook/ch03.html#_optional – matt

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