2

我创建了用于测试可失败初始化程序的示例应用程序。当我扩展 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
    }        
}

截屏

在此处输入图像描述

4

2 回答 2

1

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

之后的可失败初始化程序必须返回 Nil super.init()。这个限制应该在 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
        }
    }
}
于 2016-03-01T12:31:58.250 回答
1
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
*/
于 2016-03-01T12:34:20.513 回答