2015-04-26 92 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