Swift中的一个类中的私有Var

时间:2016-03-11 12:38:54

标签: swift accessor

我希望在Swift中的类中声明一个私有变量,并使用公共(实际上是内部)方法访问它。以下代码是关于正确的吗?

class someClass {

  // Using underscore here to distinguish variable and method
  private var _privateArray: [String]
  ...
  func privateArray() {
    return _privateArray
  }

  func setPrivateArray(someArray: [String]) {
    _privateArray = someArray
  }
}

我想使用上述内容的原因是因为我想在任何子类中使用该数组,但是使用对子类有意义的名称。

class someSubclass: someClass {

  var arrayWithMeaningfulName: [String]

  init() {
    arrayWithMeaningfulName = super.privateArray()
    ...
  }
}

不确定以上是否是实现我想要的最佳方式。感谢您的反馈。

顺便说一句,我确实尝试按如下方式声明私有变量,但编译器抱怨:

class someClass {

  private var _privateArray: [String] {
    get {
      ...
    }

    set {
    ...
  }
  ...

3 个答案:

答案 0 :(得分:2)

如果您想申报private成员,您在课堂上所要做的就是:

class myClass {

    private var _myVar = [String]() // For example

    var myVar: [String] {

        // Getter
        get {
            return self._myVar
        }

        // Setter
        set(newValue) {

            self._myVar = newValue
        }
    }
}

答案 1 :(得分:2)

请注意,Swift书籍具有以下内容:

  

您可以为setter提供比其对应的访问级别更低的访问级别   getter,限制该变量的读写范围,属性,   或下标。您通过编写私有(设置)来分配较低的访问级别   或var或下标导入器之前的内部(设置)。

所以,在你的例子中,你可以简单地拥有

public class SomeClass {
    public private(set) var privateArray: [String] = []
    public func setPrivateArray(array: [String]) {
       // do some checking, possibly
       self.privateArray = array
    }
}

您的代码中存在各种语法错误 - 您在公共函数上缺少func,并注意到您不能为属性或函数提供比其父对象更大的访问级别,因此您必须声明该类本身为public

答案 2 :(得分:1)

以下似乎有效。

class SomeClass {

    // Using underscore here for consistency with my original post
    private var _privateArray: [String] = ["a", "b", "c"]

    func reverse() {
        _privateArray = _privateArray.reverse()
    }
}

class SomeSubclass: SomeClass {

    // The array in this subclass is a computed property
    var arrayWithMeaningfulName: [String] {
        get {
            return super._privateArray
        }

        set(newArray) {
            super._privateArray = newArray
        }
    }
}

重要事项: SomeSubclass必须在同一个源文件中定义SomeClass,因为它可以访问私有成员_privateArray。例如,如果在SomeClass.swift文件中定义了SomeClass,那么SomeSubclass也必须在SomeClass.swift文件中定义。如果没有,编译器会抱怨消息“类型的值'SomeClass'没有成员变量'_privateArray'。”

“反向”方法是为了证明可以在父类中定义公共代码以避免重复,即使每个子类对于成员变量都有不同的(更有意义的)名称。