我有许多带有静态变量的子类.

class A { }
class A1: A { static var intArray: [Int] = [] }
// …
class An: A { static var intArray: [Int] = [] }  

我想使用类似这样的内容循环遍历这些子类

func test() {
    let aTypes: [A.Type] = [A1.self, /* … */ An.self]
    for aType in aTypes {
        let nextSubclass = type(of: aType)
        nextSubclass.intArray = [0] // Error: Type 'A.Type' has no member 'intArray'
    }
}

我最初想在class A中也声明static var intArray并覆盖它,但这是不允许的.我也试着用class var而不是static var,但这也是不允许的.

有没有办法达到我的目的?

推荐答案

虽然不可能覆盖static个VAR,但可以覆盖class个VAR.

但首先,考虑将A作为一项协议.

protocol A {
    static var intArray: [Int] { get set }
}

class A1: A {
    static var intArray: [Int] = []
}
// …
class An: A {
    static var intArray: [Int] = []
}

如果A必须是一个类,您可以使用class变量,如下所示(这是相当多的样板):

class A {
    class var intArray: [Int] {
        get { fatalError() }
        set { }
    }
}

class A1: A {
    private static var _intArray: [Int] = []
    override class var intArray: [Int] {
        get { _intArray }
        set { _intArray = newValue }
    }
}
// …
class An: A {
    private static var _intArray: [Int] = []
    override class var intArray: [Int] {
        get { _intArray }
        set { _intArray = newValue }
    }
}

请注意,您不应在test中使用type(of:).aType已经是您想要的类型:

func test() {
    let aTypes: [A.Type] = [A1.self, /* … */ An.self]
    for aType in aTypes {
        aType.intArray = [0]
    }
}

Swift相关问答推荐

启用完成并发判断以及如何解决警告(续)

在解码字符串时需要帮助.

如何在SwiftUI的文本视图中显示NSMutableAttributedString?

如何使用可搜索在搜索栏中搜索包括>或<?

计算 CoreData 中所有唯一对象的数量?

为什么这段Swift读写锁代码会导致死锁?

设备上ScrollView为什么会将内容高度更改为随机值,而在预览上不会? - 优化后的标题:设备上ScrollView内容高度随机变化问题解决

SwiftUI:列表背景为空列表时为黑色

数组中某些元素的总和

如何从数据中读取以空结尾的字符串?

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

自定义选取器的出现导致其他视图重新排列

P384 公钥获取IncorrectParameterSize

VStack SwiftUI 中的动态内容高度

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

即使设置为从不也可以访问 iOS11 照片库

'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)

将 [String] 存储在 NSUserDefaults 中

我可以让#selector 引用 Swift 中的闭包吗?