时间:2018-06-22 12:59:35

标签: swift

如果将以下结构更改为class,如何初始化:-

protocol P {
    init()
    init(str: String)
}

extension P {
    init() {
        self.init(str: "some default")
    }
}

struct S : P {
    var str: String
}

let s = S()
print(s.str) // prints - some default

我尝试添加默认的逐成员初始化器(更改为类后):-

class S : P {
    var str: String
    init() {
        self.init(str: String)
    }
}

它显示错误:- 错误:类型“ S”不符合协议“ P”类S:P。还有其他错误。如果将struct更改为class,如何完成初始化?

3 个答案:

答案 0 :(得分:0)

只需为非最终类别指定required

如果您学习这些概念可能会有所帮助,Swift文档会有所帮助。

代码:

class S : P {

    required init() {}

    required init(str: String) {}
}

答案 1 :(得分:0)

S需要一个初始化程序来初始化str!结构本身会生成此初始化程序,但是您必须为类编写它!

required init(str: String) {
    self.str = str
}

答案 2 :(得分:0)

类没有默认的初始化程序。您只需要编写默认实现未提供的代码即可:

class S : P {
    var str: String
    required init(str: String) { self.str = str }
}
对于非required类,这里需要

final,因为所有子类也必须实现此方法。 final类不是必需的:

final class S : P {
    var str: String
    init(str: String) { self.str = str }
}