当前位置 : 主页 > 手机开发 > 其它 >

在Swift中,如何为init的实现创建类值而不是调用现有init的类创建一个便利init

来源:互联网 收集:自由互联 发布时间:2021-06-11
我觉得答案是显而易见的,但我无法弄清楚这一点,这对我来说似乎是一个反复出现的问题.基本上我想做这样的事情: extension NSData { convenience init(JSONObject: AnyObject) { do { self = try NSJSONSer
我觉得答案是显而易见的,但我无法弄清楚这一点,这对我来说似乎是一个反复出现的问题.基本上我想做这样的事情:

extension NSData {
    convenience init(JSONObject: AnyObject) {
        do {
            self = try NSJSONSerialization.dataWithJSONObject(JSONObject, options: [])
        }
        catch {
            self = nil
        }
    }
}

但是,它不会让我简单地为自己分配一个值.我一直用枚举这样做,但它不会让我用课程来做.是否有方法使用在初始化器实现中创建的类的实例在方便初始化器中实现?

说Swift中的工厂初始化程序“尚不支持”是错误的.它们的排除是一项设计决定,它们的使用旨在由可用的初始化程序覆盖;引用 the following Apple Swift blog post

Failable initializers eliminate the most common reason for factory
methods in Swift, which were previously the only way to report failure
when constructing this object.

Using the failable initializer allows greater use of Swift’s uniform
construction syntax, which simplifies the language by eliminating
the confusion and duplication between initializers and factory
methods
.

所以在你的情况下,你可能正在寻找一个方便的可用的初始化器.例如,类似的东西

extension NSData {
    convenience init?(JSONObject: AnyObject) {
        do {
            let foo = try NSJSONSerialization.dataWithJSONObject(JSONObject, options: [])
            self.init(data: foo)
        }
        catch {
            return nil
        }
    }
}

/* Example usage */
let foo : AnyObject = ["Foo":"bar"]
let bar = NSData.init(JSONObject: foo)

在你的问题的标题中,你包括“……而不是调用现有的init”.当使用便利初始化器时,必须在某一点调用指定的初始化器(同一类)(甚至通过其他便利初始化器).从Swift Language Guide – Initialization – Class Inheritance and Initialization开始:

Rule 2

A convenience initializer must call another initializer from the same
class.

Rule 3

A convenience initializer must ultimately call a designated
initializer.

但是,如果NSJSONSerialization.dataWithJSONObject(…)失败,上面的示例代码允许方便初始化程序的早期转义(失败),但如果成功,则迟早需要调用指定的初始化程序(在本例中为init(数据:)指定初始化程序).

有关可用初始化程序的详细信息,请参阅Swift Language Guide – Initialization – Failable Initializers.有关初始化程序链(方便 – > … – >指定初始化程序)的其他说明,请参阅下面的rickster:s注释.

网友评论