Swift中能否遍历子类并访问其static var?
解决Swift子类静态属性遍历访问的问题
你遇到的问题核心是:父类A没有定义intArray静态属性,编译器无法确定A.Type类型的子类实例具备这个属性。下面提供两种可行的解决方案:
方案一:使用协议约束(推荐)
定义一个协议声明所需的静态属性,让所有子类遵守该协议,就能统一遍历协议类型数组并访问属性。
代码示例
// 定义协议,明确静态属性要求 protocol HasIntArray { static var intArray: [Int] { get set } } class A { } // 子类继承A的同时遵守协议 class A1: A, HasIntArray { static var intArray: [Int] = [] } class A2: A, HasIntArray { static var intArray: [Int] = [] } // ...其他子类同理 func test() { // 声明协议类型的数组,而非A.Type let aTypes: [HasIntArray.Type] = [A1.self, A2.self] for aType in aTypes { aType.intArray = [0] // 编译通过,正常访问属性 } }
这种方式结构清晰,协议明确了属性要求,编译器能准确识别类型,且无需修改父类A的原有结构。
方案二:父类定义可重写的类属性
如果不想引入协议,可以在父类A中定义可重写的class var,子类通过重写提供具体的存储实现。
代码示例
class A { // 父类定义抽象类属性,强制子类重写 class var intArray: [Int] { get { fatalError("子类必须重写intArray属性") } set { fatalError("子类必须重写intArray属性") } } } class A1: A { // 子类定义私有存储属性作为底层容器 private static var _intArray: [Int] = [] // 重写父类的class var,关联到私有存储属性 override class var intArray: [Int] { get { _intArray } set { _intArray = newValue } } } class A2: A { private static var _intArray: [Int] = [] override class var intArray: [Int] { get { _intArray } set { _intArray = newValue } } } // ...其他子类同理 func test() { let aTypes: [A.Type] = [A1.self, A2.self] for aType in aTypes { aType.intArray = [0] // 直接访问父类属性,自动调用子类重写的实现 } }
这种方式无需额外协议,但每个子类都需要编写重写逻辑,相比协议方案稍显繁琐。
内容的提问来源于stack exchange,提问作者Reinhard Männer
相关产品推荐
相关产品推荐

