在Swift中,如何为init的实现创建类值而不是调用现有init的类创建
我觉得答案是显而易见的,但我无法弄清楚这一点,这对我来说似乎是一个反复出现的问题.基本上我想做这样的事情:
extension NSData { convenience init(JSONObject: AnyObject) { do { self = try NSJSONSerialization.dataWithJSONObject(JSONObject,options: []) } catch { self = nil } } } 但是,它不会让我简单地为自己分配一个值.我一直用枚举这样做,但它不会让我用课程来做.是否有方法使用在初始化器实现中创建的类的实例在方便初始化器中实现? 解决方法
说Swift中的工厂初始化程序“尚不支持”是错误的.它们的排除是一项设计决定,它们的使用旨在由可用的初始化程序覆盖;引用
the following Apple Swift blog post
所以在你的情况下,你可能正在寻找一个方便的可用的初始化器.例如,类似的东西 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开始:
但是,如果NSJSONSerialization.dataWithJSONObject(…)失败,上面的示例代码允许方便初始化程序的早期转义(失败),但如果成功,则迟早需要调用指定的初始化程序(在本例中为init(数据:)指定初始化程序). 有关可用初始化程序的详细信息,请参阅Swift Language Guide – Initialization – Failable Initializers.有关初始化程序链(方便 – > … – >指定初始化程序)的其他说明,请参阅下面的rickster:s注释. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |