2015-04-26 69 views
1

我有這個類標識和一個字符串的實例字典與字符串作爲鍵。我想通過一個字符串訪問其中的一個實例並改變它的一些屬性。我試圖使用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" 
} 

我收到一個錯誤,關於爲「tony」分配i.name。我需要以某種方式將i轉換成身份證嗎?我認爲它已經是了。

回答

1

您已經聲明i作爲可選:

var i: Identity? // ... 

所以它仍然是一個可選。這不是身份。這是一個可選的包裝身份。但是你不能做任何事情任意 - 直到你解開它。打開它,以獲得身份。您有:

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 
} 

uidtokenname都是選配,所以他們已經無。你可以削減這三條線。]

+0

我相信你也可以這樣做:'i?.name =「tony」'也沒有3行代碼。 – Oxcug

+0

@theMonster當然,我會把它扔進去,爲什麼不呢? – matt

+0

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