Swift 中的 Class 中的私有变量

Private Var Inside a Class in Swift

我希望在 Swift 中的 class 中声明一个私有变量,并使用 public(实际上是内部)方法访问它。下面的代码对吗?

class someClass {

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

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

我想使用上面的原因是因为我想在任何 subclasses 中使用数组,但名称对 subclass.[=15 有意义=]

class someSubclass: someClass {

  var arrayWithMeaningfulName: [String]

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

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

顺便说一句,我确实尝试过如下声明私有变量,但编译器报错:

class someClass {

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

    set {
    ...
  }
  ...

如果您想声明一个 private 成员,您在 class 中所要做的就是:

class myClass {

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

    var myVar: [String] {

        // Getter
        get {
            return self._myVar
        }

        // Setter
        set(newValue) {

            self._myVar = newValue
        }
    }
}

请注意 Swift 书中有以下内容:

You can give a setter a lower access level than its corresponding getter, to restrict the read-write scope of that variable, property, or subscript. You assign a lower access level by writing private(set) or internal(set) before the var or subscript introducer.

因此,在您的示例中,您可以简单地

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

您的代码中存在各种语法错误 - 您在 public 函数中缺少 func,请注意您不能为 属性 或函数提供比以下更高的访问级别它的父对象,因此您必须将 class 本身声明为 public.

以下似乎有效。

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 在文件 SomeClass.swift 中定义,那么 SomeSubclass 也必须在文件 SomeClass.swift 中定义。如果不是,编译器会报错 "Value of type 'SomeClass' has no member variable '_privateArray'."

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