可失败的初始化 - 初始化前使用的变量'self.customerType'



我已经上下阅读了有关此内容的内容,并了解了这里的基础知识 - 我只是不明白为什么会出现此错误。我使用第二个 init 从 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(因为它是错误的(。你 alo 将let customerType: customerTypes声明为类的属性之一。

这意味着,如果您成功地从初始值设定项返回(这意味着不返回nil(,则必须将此属性初始化为某个值。

该错误在错误的位置不是很有帮助,因为错误实际上在下面的行中。通过简单地将return放入您的guard中,您是在说您的对象已成功初始化,但事实并非如此,因为您尚未customerType设置为值。

因此,如果您在guard子句中放入return nil,您会说初始化失败,然后您不需要在customerType中输入值。

没有初始值的属性需要在init内设置。您可以通过将它们设置为Optional或设置默认值来解决此问题:

init?(data: [String: Any]) {
customerType = .consumer
name1 = ""
}

或:

var customerType: customerTypes?
var name1: String?

注意:通过设置属性Optional编译器假定初始值为nil

最新更新