类的swift protcol扩展链接初始化

类的swift protcol扩展链接初始化,swift,Swift,如果我将以下结构更改为类,如何初始化:- 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 {

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

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,如何完成初始化?

只需为非最终类指定
必需的

如果您了解这些概念,Swift文档可能会有所帮助

代码:
S
需要一个初始值设定项来初始化
str
!结构本身生成这个初始值设定项,但您必须为类编写它

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

类没有默认的初始值设定项。您只需编写默认实现未提供的功能:

class S : P {
    var str: String
    required init(str: String) { self.str = str }
}
对于非
final
类,此处需要
required
,因为所有子类也必须实现此方法。
最终
课程不需要:

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

您需要添加类似
required init(str:String){self.str=str}
的内容,我可能对您的问题进行了过度编辑。我越看第二段代码,它就越没有意义。你能确定这是你的真实密码吗?@Sweeper-你的答案是working@Rob纳皮尔-没关系。你说得对,这不是我真正的代码。这是另一个问题——哈米什回答。我将结构更改为类,并且出现错误。您是否可以更新为实际代码;我确信答案非常简单,但我们需要确切地知道您犯了什么错误。我相信所需的关键字不是解决方案,而是询问者的代码忘记了协议要求的
init(str:String)
。只需要实现init。如果没有必需的关键字,它将抛出编译error@user1046037-你的回答有误。清扫者的答案是有效的。
final class S : P {
    var str: String
    init(str: String) { self.str = str }
}