我希望在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 {
...
}
...
答案 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'。”
“反向”方法是为了证明可以在父类中定义公共代码以避免重复,即使每个子类对于成员变量都有不同的(更有意义的)名称。