【问题标题】:Initialising mandatory properties in child class initialiser - Swift在子类初始化器中初始化强制属性 - Swift
【发布时间】:2018-04-19 18:15:52
【问题描述】:

这是我的类层次结构:

class Parent {
    var name: String
    var age: Int
    init(dict: [String: Any]) {
        age = dict["age"] as! Int
    }//ERROR: "Return from initializer without initializing all stored properties"
}

class Child: Parent {
    var school: String
    override init(dict: [String: Any]) {
        school = dict["school"] as! String
        super.init(dict: dict)

        name = dict["childname"] as! String
    }
}

如果我在 Parent 初始化器中初始化 name 属性,那么它可以工作,但在我的情况下,我希望它只在 Child 中初始化。

有什么办法可以解决吗?

附: Parent 中有很多属性,例如 name 这些应该在 Child 中初始化

【问题讨论】:

  • 这没有意义,创建Parent对象必须初始化所有属性。如果name 仅存在于 Child 中,则使其成为 Child 的属性。
  • 绝对没有办法达到你想要的。 init 方法必须初始化所有成员。

标签: swift initialization optional


【解决方案1】:

Class/Struct 属性不能为 nil/null。您必须在声明时或在Class/Struct'sinitializers 内部初始化Class/Struct 属性。如果您希望属性保持为 nil/null 并希望稍后填充它们,则必须将变量/引用声明为 Optional

在您的情况下,将Parent 类的name 变量设置为Optional,就像这样var name: String?

class Parent {
var name: String?
var age: Int
init(dict: [String: Any]) {
    age = dict["age"] as! Int
}
}

class Child: Parent {
var school: String
override init(dict: [String: Any]) {
    school = dict["school"] as! String
     super.init(dict: dict)
     name = dict["childname"] as! String
}
}

let dict: [String: Any] = ["childname":"Mamun", "school":"school name", 
"age": 12]
let child = Child(dict: dict)
print("Child name: \(child.name!)")

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2011-11-13
    • 2021-01-17
    • 1970-01-01
    • 2017-09-29
    • 2016-06-17
    相关资源
    最近更新 更多