Swift 3:私有所需的初始化程序可能吗?

时间:2017-03-11 20:12:09

标签: swift

请考虑以下代码:

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

1 个答案:

答案 0 :(得分:2)

你为什么要一个?

required的目的意味着在声明此类时强制使用此初始化。就像@Hamish所说的那样,将它设置为private只会导致类无法看到它而无法声明它。如果您想要进行其他设置但又不希望它可以访问,为什么不在private func内拨打required init