Swift中类内的私有Var
我希望在Swift中声明一个类中的私有变量,并使用公共(实际上是内部)方法访问它。以下代码是否正确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
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”时,我真的是指默认的内部错误。