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 都有不同的(更有意义)成员变量的名称。
我希望在 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 都有不同的(更有意义)成员变量的名称。