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