gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:15 26 4
gpt4 key购买 nike

我觉得答案很明显,但我一直无法弄清楚,这对我来说似乎是一个反复出现的问题。基本上我想做这样的事情:

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

但是它不会让我简单地为 self 赋值。我一直用枚举来做这件事,但它不允许我用类来做。有没有什么方法可以使用在初始化器实现中创建的类的实例来实现方便的初始化器?

最佳答案

说工厂初始化器在 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”。当使用 convenience 初始化器时,必须在某个时候调用指定的初始化器(同一类)(即使通过其他便利初始化器)。来自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(data:) 指定的初始化程序)。


有关可失败初始化器的详细信息,请参阅 Swift Language Guide - Initialization - Failable Initializers .有关初始化器链的附加说明(convenience -> ... -> designated initializer),请参阅下面的 rickster:s 评论。

关于swift - 在 Swift 中,如何为 init 的实现创建类值而不是调用现有 init 的类创建便利的 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com