最佳实践在swift中实现failable初始化
使用以下代码,我尝试定义一个简单的模型类,它的failable初始化,它接受一个(json-)字典作为参数。如果用户名未在原始json中定义,初始化程序应返回nil。
1。 "All stored properties of a class instance must be initialized before returning nil from an initializer" 这没有意义。当我计划返回nil时,为什么要初始化这些属性? 2。 class User: NSObject { let userName: String let isSuperUser: Bool = false let someDetails: [String]? init?(dictionary: NSDictionary) { if let value: String = dictionary["user_name"] as? String { userName = value } else { return nil } if let value: Bool = dictionary["super_user"] as? Bool { isSuperUser = value } someDetails = dictionary["some_details"] as? Array super.init() } }
更新:从
Swift 2.2 Change Log(发布2016年3月21日):
对于Swift 2.1及更早版本: 根据苹果的文档(和你的编译器错误),类必须初始化所有存储的属性,然后从failable初始化器返回nil:
注意:它实际上适用于结构和枚举,只是不是类。 建议的处理在初始化器失败之前无法初始化的存储属性的方法是将它们声明为隐式解包的可选项。 文档中的示例: class Product { let name: String! init?(name: String) { if name.isEmpty { return nil } self.name = name } }
在你的情况下,然而,简单地定义userName作为一个字符串!不修复编译错误,因为你仍然需要担心初始化基类NSObject的属性。幸运的是,使用userName定义为String!,你可以在返回nil之前调用super.init(),它将初始化你的NSObject基类并修复编译错误。 class User: NSObject { let userName: String! let isSuperUser: Bool = false let someDetails: [String]? init?(dictionary: NSDictionary) { super.init() if let value = dictionary["user_name"] as? String { self.userName = value } else { return nil } if let value: Bool = dictionary["super_user"] as? Bool { self.isSuperUser = value } self.someDetails = dictionary["some_details"] as? Array } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |