以更优雅的方式从字典中获取值

时间:2014-06-09 01:10:59

标签: swift

我一直玩得很快,我受到了很大的折磨!考虑:

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

2 个答案:

答案 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("")

这也适用于所有选项。

注意:我开始moduleor上添加Optional这样的常见帮助,以便迅速添加。