【问题标题】:Swift 2.1 : Getting error while extends NSObjectSwift 2.1:扩展 NSObject 时出错
【发布时间】:2016-06-13 20:45:44
【问题描述】:

我创建了用于测试可失败初始化程序的示例应用程序。当我扩展 NSObject 时,我收到以下错误。

1) 属性“self.userName”未在 super.init 调用中初始化。
2) 不可变值“self.userDetails”只能初始化一次。
3) 不可变值“self.userName”只能初始化一次。

请在下面找到相同的代码和屏幕截图。

class User: NSObject {

    let userName: String!
    let userDetails: [String]?

    init?(dictionary: NSDictionary) {
        super.init()

        if let value = dictionary["user_name"] as? String {
            self.userName = value
        }
        else {
            return nil
        }

        self.userDetails = dictionary["user_Details"] as? Array
    }        
}

截图

【问题讨论】:

    标签: swift2 nsobject xcode7.2


    【解决方案1】:

    所有属性必须在super.init()之前初始化

    super.init() 之后必须从失败的初始化程序返回 Nil。这个限制should be removed in Swift 2.2

    正确的实现是:

    class User: NSObject {
    
        let userName: String!
        let userDetails: [String]?
    
        init?(dictionary: NSDictionary) {
            if let value = dictionary["user_name"] as? String {
                self.userName = value
            } else {
                self.userName = nil
            }
    
            self.userDetails = dictionary["user_Details"] as? Array
    
            super.init()
    
            if userName == nil {
                return nil
            }
    
            else if userDetails == nil {
                return nil
            }
        }
    }
    

    【讨论】:

    • 您能否提供链接,指出故障初始化程序已从 swift 2.2 中删除?
    • 在 2.2 中将被删除,不是保释初始化程序,而是第二个限制
    【解决方案2】:
    import Foundation
    
    let dictionary = ["user_name": "user", "user_Details":[1,2,3]]
    
    class User: NSObject {
    
        var userName: String?
        var userDetails: [String]?
    
        init?(dictionary: NSDictionary) {
            super.init()
            if let value = dictionary["user_name"] as? String {
                self.userName = value
            }
            else {
                return nil
            }
    
            self.userDetails = dictionary["user_Details"] as? Array
        }        
    }
    
    let c = User(dictionary: dictionary)
    dump(c)
    /*
    ▿ User
      ▿ Some: User #0
        - super: <__lldb_expr_31.User: 0x7fe372f15860>
        ▿ userName: user
          - Some: user
        - userDetails: nil
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多