6

做这样的事情很简单:

class Collection {
    init(json: [String: AnyObject]){
        guard let id = json["id"] as? Int, name = json["name"] as? String else {
            print("Oh noes, bad JSON!")
            return
        }
    }
}

在那种情况下,我们let用来初始化局部变量。但是,修改它以使用类属性会导致它失败:

class Collection {

    let id: Int
    let name: String

    init(json: [String: AnyObject]){
        guard id = json["id"] as? Int, name = json["name"] as? String else {
            print("Oh noes, bad JSON!")
            return
        }
    }

}

它抱怨letvar需要使用,但显然情况并非如此。在 Swift 2 中执行此操作的正确方法是什么?

4

1 回答 1

13

在 中if let,您将可选项中的值解包为新的局部变量。您无法打开现有变量。相反,您必须打开包装,然后分配即

class Collection {

    let id: Int
    let name: String

    init?(json: [String: AnyObject]){
        // alternate type pattern matching syntax you might like to try
        guard case let (id as Int, name as String) = (json["id"],json["name"]) 
        else {
            print("Oh noes, bad JSON!")
            self.id = 0     // must assign to all values
            self.name = ""  // before returning nil
            return nil
        }
        // now, assign those unwrapped values to self
        self.id = id
        self.name = name
    }

}

这不是特定于类属性 - 您不能有条件地绑定任何变量,例如这不起作用:

var i = 0
let s = "1"
if i = Int(s) {  // nope

}

相反,您需要这样做:

if let j = Int(s) {
  i = j
}

(当然,在这种情况下你会更好let i = Int(s) ?? 0

于 2015-07-07T14:25:56.847 回答