ios - Failable Init - 在初始化之前使用的变量“self.customerType”
问题描述
我已经对此进行了上下阅读,并了解了这里的基础知识-我只是不明白为什么会出现此错误。我使用第二个初始化从 Firebase 实例化一个客户,但即使我注释掉其中的所有内容,我仍然会收到错误
Variable 'self.customerType' used before being initialized
在初始化声明中?
class Customer {
enum customerTypes {
case consumer
case business
}
// MARK - properties
var id: String?
let customerType: customerTypes
var name1: String
var name2: String?
var address: Address?
var phone: String?
var email: String?
struct Address {
var street: String
var postalCode: String
var city: String
var country: String = "Norway"
}
init(type: customerTypes, name1: String, name2: String?, phone: String, email: String, address: Address? ) {
self.customerType = type
self.name1 = name1
self.name2 = name2
self.phone = phone
self.email = email
self.address = address
}
init?(data: [String: Any]) {
guard let type = data["customerType"] as? String else { return }
guard let name1 = data["name1"] as? String else { return }
self.customerType = type == "Consumer" ? .consumer : .business
self.name1 = name1
// if let name2 = data["name2"] as? String { self.name2 = name2 }
// if let phone = data["phone"] as? String { self.phone = phone }
// if let email = data["email"] as? String{ self.email = email }
// if let address = data["address"] as? [String: Any] {
// let street = address["street"] as? String
// let postCode = address["postCode"] as? String
// let city = address["city"] as? String
// if street != nil && postCode != nil && city != nil {
// self.address = Address(street: street!, postalCode: postCode!, city: city!)
// }
// }
}
我在这里忽略了什么简单的问题?
解决方案
你声明了一个初始化器,它承诺要么返回一个初始化的Customer
要么不返回Customer
(因为它是错误的)。您也声明let customerType: customerTypes
为该类的属性之一。
这意味着如果您从初始化程序成功返回(即不返回nil
),则必须将该属性初始化为某个值。
该错误对错误的位置不是很有帮助,因为错误实际上在下面的行中。通过简单地放入return
您的guard
,您是在说您的对象已成功初始化,但事实并非如此,因为您尚未设置customerType
一个值。
所以如果你return nil
在你的guard
子句中放一个a,你会说你的初始化失败了,那么你就不需要在你的子句中放一个值了customerType
。
推荐阅读
- aggregation - 在 Apache Druid 上存储每日价格的最佳方式是什么?
- java - 即使战争看起来不错,Tomcat 应用程序也无法启动
- reactjs - Axios 和 onClick 的问题 - React JS
- android - 无法使用 Device Policy 配置文件在 Android 设备上安装 Firebase App Tester 应用程序
- azure-devops - Azure DevOps 为什么我的“添加测试”不能出现在我的看板功能卡上
- docker - 使用 Traefik 和 Docker Compose 在同一主机上提供 2 个服务,但路由不同
- django - Django 重用类视图
- c++ - Windows下webrtc编译时如何避免子库聚合?
- npm - ngx-dropzone 从列表中加载图像
- rust - 条件语句中的链接是惯用的生锈吗?