extension NSData { convenience init(JSONObject: AnyObject) { do { self = try NSJSONSerialization.dataWithJSONObject(JSONObject,options: []) } catch { self = nil } } }
但是,它不会让我简单地为自己分配一个值.我一直用枚举这样做,但它不会让我用课程来做.是否有方法使用在初始化器实现中创建的类的实例在方便初始化器中实现?
解决方法
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注释.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。