微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Swift 2中设置多个类属性时保护

做这样的事情是微不足道的:

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,bad JSON!")
            return
        }
    }

}

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

解决方法

在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
}

(当然,在这种情况下你最好让我i = Int(s)?? 0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐