遍历Type数组时出现“使用未声明的类型”错误

时间:2019-02-07 18:29:22

标签: swift macos

给定一个包含多个子类实例的数组(所有子类都具有相同的超类),我想检查实例是否代表了所需子类类型的另一个数组的所有元素。

我想出了一个我认为是有效的解决方案,但是我为这个错误所困扰:在requiredTypes.allSatisfy {...}

的闭包中使用未声明的类型'requiredType'
class MyClass { }

class SubClass1: MyClass { }
class SubSubClass1: SubClass1 { }
class SubClass2: MyClass { }
class SubClass3: MyClass { }

let requiredTypes = [SubClass1.self, SubClass2.self]

let instances = [SubSubClass1(), SubClass2()]

let meetsRequirements = requiredTypes.allSatisfy { (requiredType) -> Bool in
    return instances.map({$0 is requiredType}).contains(true)
}

1 个答案:

答案 0 :(得分:4)

is运算符需要一种在编译时已知的类型。您不能在那里使用变量。

一种可能性是使用type(of:),例如:

let meetsRequirements = requiredTypes.allSatisfy { requiredType in 
    instances.contains { type(of: $0) == requiredType }
}

尽管SubSubClass1会出现问题。

如果您的类继承自NSObject,则可以使用:

let meetsRequirements = requiredTypes.allSatisfy { requiredType in 
    instances.contains { $0.isKind(of: requiredType) }
}

Swift当前不支持检查类是否从存储在变量中的类型继承。通常这是一种代码气味。