在子类初始化器中初始化强制属性 - Swift

时间:2018-04-19 18:15:53

标签: swift initialization optional

继承我的班级层次结构:

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
    }
}

如果我在name初始化程序中初始化Parent属性,那么它正在运行,但在我的情况下,我希望它仅在Child初始化。

有没有办法解决这个问题?

P.S。 Parent中有很多属性,例如name,应该在Child初始化

1 个答案:

答案 0 :(得分:2)

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

在您的情况下,将name类的Parent变量设为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!)")