访问类内私有数组报错:Swift类闭包无法访问实例成员求助
问题分析与解决方案
嗨,我来帮你搞清楚这个错误的原因,以及怎么修复它!
为什么会报错?
你遇到的「Instance member 'arr' cannot be used on type 'MyArray'」错误,核心原因是你声明的reverse闭包是类的普通存储属性,它默认处于「类型上下文」中,而非「实例上下文」。也就是说,这个闭包在类本身被定义的时候就初始化了,此时还没有创建MyArray的实例,闭包里无法访问属于实例的arr属性——它会误以为你想访问MyArray这个类型的静态成员arr,但arr明明是实例的私有变量,所以就触发了报错。
修复方案(三种可选)
方案1:用lazy延迟初始化闭包(保留闭包形式)
把reverse改成lazy var,这样闭包会在第一次通过实例访问它的时候才初始化,此时已经有了实例,闭包可以捕获self来访问arr:
public class MyArray { private var arr: [Int] = [] internal static var instance: MyArray? // 修改成lazy var,让闭包捕获当前实例的self public lazy var reverse = { () -> [Int] in var returnArray : [Int] = [] var counter = self.arr.count - 1 for _ in 0..<self.arr.count { returnArray.append(self.arr[counter]) counter -= 1 } return returnArray } private init() {} public static func getInstance() -> MyArray { if self.instance == nil { self.instance = MyArray() } return self.instance! } }
方案2:改成计算属性(更符合Swift风格)
既然反转数组的结果完全依赖当前arr的状态,用计算属性会更合适,不需要闭包也能实现:
public class MyArray { private var arr: [Int] = [] internal static var instance: MyArray? // 计算属性,每次访问都会基于当前arr生成反转结果 public var reverse: [Int] { var returnArray: [Int] = [] var counter = arr.count - 1 for _ in 0..<arr.count { returnArray.append(arr[counter]) counter -= 1 } return returnArray } private init() {} public static func getInstance() -> MyArray { if self.instance == nil { self.instance = MyArray() } return self.instance! } }
方案3:改成实例方法(最直观的方式)
如果反转数组是一个动作,把它定义成实例方法也很合理,调用时用instance.reverse()即可:
public class MyArray { private var arr: [Int] = [] internal static var instance: MyArray? // 实例方法,直接访问当前实例的arr public func reverse() -> [Int] { var returnArray: [Int] = [] var counter = arr.count - 1 for _ in 0..<arr.count { returnArray.append(arr[counter]) counter -= 1 } return returnArray } private init() {} public static func getInstance() -> MyArray { if self.instance == nil { self.instance = MyArray() } return self.instance! } }
额外小建议
其实Swift的数组本身就内置了reversed()方法,你可以直接复用它来简化代码,比如计算属性可以写成:
public var reverse: [Int] { return arr.reversed() }
或者方法写成:
public func reverse() -> [Int] { return arr.reversed() }
这样既简洁又不容易出错~
内容的提问来源于stack exchange,提问作者Vermaji
相关产品推荐
相关产品推荐

