我正在做我认为非常简单的任务.如果密钥存在,我正试图从字典中获取值.我正在为字典中的几个键执行此操作,然后创建一个对象(如果它们都存在)(基本上解码
JSON对象).我是语言的新手,但在我看来它应该可行,但不是:
class func fromDict(d: [String : AnyObject]!) -> Todo? { let title = d["title"]? as? String // etc... }
它给了我错误:postfix的操作数?应该有可选的类型; type是(String,AnyObject)
但是,如果我这样做,它的工作原理:
class func fromDict(d: [String : AnyObject]!) -> Todo? { let maybeTitle = d["title"]? let title = maybeTitle as? String // etc... }
它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?
解决方法
推荐的模式是
if let maybeTitle = d["title"] as? String { // do something with maybeTitle } else { // abort object creation }
这可能是一个细微差别的问题.表格数组[下标]?是不明确的,因为它可能意味着整个字典(< String:AnyObject>)是可选的,而你可能意味着结果(字符串).在上面的模式中,您利用了Dictionary设计为假设以可选类型访问某些键结果的事实.
经过实验,并注意到了?之后就像暧昧一样,更多,这是我的解决方案:
var dictionary = ["one":"1","two":"2"] // or var dictionary = ["one":1,"two":2] var message = "" if let three = dictionary["three"] as Any? { message = "\(three)" } else { message = "No three available." } message // "No three available."
这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.
如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?