我一直玩得很快,我受到了很大的折磨!考虑:
var myDict : Dictionary <String, String>
//DO SOME MAGIC TO POPULATE myDict with values
<magic being done>
//Now myDict has values. Let's parse out the values of myDict
//This doesn't work
let title : String = myDict["title"]
//This does
let title : String? myDict["title"]
这是因为不知道密钥是否在字典中。不过我要说的是“如果标题键在字典中,给我那个值,否则,只给我一个空字符串”
我可以写:
var myTitle : String
if let title : String = myDict["title"] {
myTitle = title
} else {
myTitle = ""
}
我相信它有效......但是......对于字典的EACH键来说,这是相当多的代码。有没有人在迅速的世界中有任何关于如何写这个的想法?
RD
答案 0 :(得分:2)
您可以明确地解包该值:
let title : String = myDict["title"]!
或隐含地:
let title : String! = myDict["title"]
请注意,除非您确定title
,否则仍需检查nil
是否为T
。
修改强>
以下是类型@infix func | <T: Any>(lhs: T?, rhs: T!) -> T! {
if lhs {
return lhs!
}
return rhs
}
var myDict : Dictionary <String, String> = ["a": "b"]
let title1 = (myDict["a"] | "") // "b"
let title2 = (myDict["title"] | "") // ""
的任何可选项的全局运算符重载示例:
{{1}}
答案 1 :(得分:2)
您可以在可选项上编写扩展程序:
extension Optional {
/// Unwrap the value returning 'defaultValue' if the value is currently nil
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
然后你可以这样做:
myDict["title"].or("")
这也适用于所有选项。
注意:我开始module在or
上添加Optional
这样的常见帮助,以便迅速添加。