给定一个包含多个子类实例的数组(所有子类都具有相同的超类),我想检查实例是否代表了所需子类类型的另一个数组的所有元素。
我想出了一个我认为是有效的解决方案,但是我为这个错误所困扰:在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)
}
答案 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当前不支持检查类是否从存储在变量中的类型继承。通常这是一种代码气味。