关于ios:Failable Init-初始化前使用的变量’self.customerType’

 2021-04-09 

Failable Init - Variable 'self.customerType' used before being initialized

我已经对此进行了阅读和阅读,并在这里了解了基本知识-我只是不明白为什么会出现此错误。我使用第二个init从Firebase实例化一个客户,但是即使我注释掉其中的所有内容,我仍然会收到错误

Variable 'self.customerType' used before being initialized是否在初始化声明中?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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!)
//          }
//      }

    }

我在这里忽略了什么简单的问题?


您声明一个初始化器,该初始化器Promise返回一个初始化的Customer或不返回任何Customer(因为它容易出错)。您也将let customerType: customerTypes声明为该类的属性之一。

这意味着,如果您成功从初始化程序返回(即不返回nil),则必须将此属性初始化为某个值。

该错误对于错误的位置不是很有帮助,因为该错误实际上在下面的行中。只需将return放入guard中,就表示您的对象已成功初始化,但尚未成功初始化,因为尚未将customerType设置为值。

因此,如果在guard子句中放入return nil,则将说初始化失败,则无需在customerType中放入值。


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

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

或:

1
2
var customerType: customerTypes?
var name1: String?

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