【问题标题】:How to mark super classes initializers as private in swift?如何在swift中将超类初始化器标记为私有?
【发布时间】:2016-01-19 06:27:54
【问题描述】:

我想用我指定的初始化程序初始化一个类,以避免在未初始化所有实例变量的情况下使用该对象。出于某种原因,我无法在 Swift 2 中将 init() 方法标记为私有。我在 Swift 1.2 中将 init() 标记为私有。它在 Swift 2.0 中删除了吗?无论如何将 init() 标记为私有!?

【问题讨论】:

  • 您可以使用内部,而不是对您的子类可见。
  • @dirtydanee:这不太正确。在 Swift 中,内部访问允许实体在其定义模块的任何源文件中使用。
  • 一个具体的例子会很有帮助。 Swift 编译器不允许在未初始化所有实例变量的情况下创建对象。
  • Swift 的“惰性存储属性”为初始化实例变量提供了一个优雅的解决方案。它们只被初始化一次,但只有在第一次访问时才被初始化。这也可以消除使它们成为可选项的需要。这是一个很棒的功能!
  • 我的问题是,如果我有一个必须用字符串数组初始化的类,它应该只用那个初始化器来初始化。我不希望使用任何其他初始化程序创建类的实例。

标签: ios swift cocoa-touch swift2 ios9


【解决方案1】:

也许你应该试试这个模式:

class PrivateInitObject: NSObject {

var text: String!    

 internal init(withText text: String){    
    super.init()

    self.text = text

  }
}

然后你可以看到没有 public init()

class someClass {

   let obj = PrivateInitObject(withText: "some text")
   let obj2 = PrivateInitObject() // compile error, init() is private
}

【讨论】:

  • 我们可以使用@available 属性使其对用户不可用。但我认为这不是最好的方法。
猜你喜欢
  • 2017-10-26
  • 2016-08-19
  • 1970-01-01
  • 2023-04-02
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
相关资源
最近更新 更多