请考虑以下代码:
private class MyClass {
private required init(_ i: Int) {
}
}
现在,我收到了编译错误:
'required' initializer must be as accessible as its enclosing type
。但该类型声明为private
。
我认为问题可能是该类是在文件级别声明的,所以它是
private
类型
将实体的使用限制在封闭声明中。
为documentation says。所以它有效地使它fileprivate
,因为封闭声明是一个文件。但即使对于嵌套的私有类,我也会遇到同样的错误。
当我将初始化程序声明为fileprivate
时,它可以工作:
private class MyClass {
private class MyNested {
fileprivate required init(_ i: Int) {
}
}
}
问题:为什么private
在这里不正确?是否可以声明private required
初始化程序?
我问,因为我想首先理解错误。
为什么我需要它是一个相当不同的问题,但最初我写了这样的代码:
private class MyClass {
private class MyNested {
private init(_ i: Int) {
}
func foo() {
var f = type(of: self).init(1)
}
}
}
然后在我收到错误时必须添加required
声明说明符:constructing an object of class type 'MyClass.MyNested' with a metatype value must use a 'required' initializer
答案: 感谢@SørenMortensen:
私有初始化程序的问题是
MyNested
类可以在MyClass
内访问,但初始化程序只能在MyNested
内访问,因此不像其封闭类型那样可访问。正如@Hamish指出的那样,required
初始化者的概念与private
初始化者的概念是互斥的。
所以看起来确实不可能拥有private required
初始化程序。在我的情况下,我可以将MyNested
类设为final
,然后使初始值设定项private
不使其成为required
。
答案 0 :(得分:2)
你为什么要一个?
required
的目的意味着在声明此类时强制使用此初始化。就像@Hamish所说的那样,将它设置为private
只会导致类无法看到它而无法声明它。如果您想要进行其他设置但又不希望它可以访问,为什么不在private func
内拨打required init
?