Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中类内的私有Var_Swift_Accessor - Fatal编程技术网

Swift中类内的私有Var

Swift中类内的私有Var,swift,accessor,Swift,Accessor,我希望在Swift中声明一个类中的私有变量,并使用公共(实际上是内部)方法访问它。以下代码是否正确 class someClass { // Using underscore here to distinguish variable and method private var _privateArray: [String] ... func privateArray() { return _privateArray } func setPrivateArra

我希望在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 {
    ...
  }
  ...

如果你想声明一个
private
成员,你需要在你的类中做的就是:

class myClass {

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

    var myVar: [String] {

        // Getter
        get {
            return self._myVar
        }

        // Setter
        set(newValue) {

            self._myVar = newValue
        }
    }
}

请注意,Swift账簿具有以下内容:

您可以给setter一个低于其相应的访问级别 getter,要限制该变量的读写范围, 或下标。通过写入private(set)指定较低的访问级别 或变量或下标介绍人之前的内部(集合)

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

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

您的代码中有各种语法错误-您的公共函数缺少
func
,请注意,您不能为属性或函数提供比其父对象更高的访问级别,因此您必须将类本身声明为
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中定义。如果没有,编译器将发出消息“类型为'SomeClass'的值没有成员变量'\u privateArray'


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

什么使您认为它可能不“大约正确”?对于私有变量,公共访问器的优势/用途是什么(严肃的问题)?
“我之所以要使用上述方法,是因为我想在任何子类中使用数组,但名称对子类都有意义。”
这对我来说没有太多意义。当然,我完全支持命名良好的变量,但我想我需要一个更具体的例子来说明您在这里试图实现的目标,因为它没有太多意义。斯科特·亨特我想托马斯a已经回答了您的问题;我应该使用一个计算属性,而不是两个方法。@Koen您甚至在设置数据时也需要封装数据…这样您就可以过滤您不想要的值,即:
如果myValue<0,那么不要设置它并返回一个错误
Doh!所以只是确认一下,myVar是一个计算属性?我一定太累了…谢谢。
myVar
是您想要处理的类的成员…所以是的你的代码是正确的,它没有提供我想要的,因为我不想公开访问_myVar,即使是通过myVar.Grimxn,感谢你指出我不可靠代码中的错误,希望我已经纠正了所有错误。当我说“public”时,我真的是指默认的内部错误。