我有一个类数组,我想检查某个变量是否与该数组中的某个元素匹配。这就是我在Objective-C中要做的事情:
NSArray *arrayOfClasses = @[UIButton.class, UILabel.class];
Class aClass = arrayOfClasses[0];
UIButton *button = [UIButton new];
if ([button isKindOfClass:aClass]) {
NSLog("button is aClass")
}
但我无法在Swift中找到一种方法:
let arrayOfClasses = [UIButton.self, UILabel.self]
let aClass = arrayOfClasses[0] as! NSObject.Type
let button = UIButton()
if button is aClass {
NSLog("button is aClass")
}
上面的代码引发了一个错误'aClass' is not a type
。我还尝试了as! AnyClass
,as! AnyClass.Type
,as! AnyObject.Type
等。
更新
感谢@matt,我现在知道如何让它在纯Swift中工作。但是如果在Objective-C中创建了arrayOfClasses
,它会因错误Could not cast value of type 'DummyA' (0x1049f48a0) to 'Swift.AnyObject.Type'
而崩溃。这是有道理的,因为Objective-C类现在是swift中的AnyObject,它不能将AnyObject转换为AnyClass。
以下是示例代码:
@interface DummyA : NSObject
+ (NSArray *)dummies;
@end
@interface DummyB : NSObject
@end
@implementation DummyA
+ (NSArray *)dummies
{
return @[[DummyA class], [DummyA class], [DummyB class], [DummyB class]];
}
@end
@implementation DummyB
@end
let arrayOfClasses = DummyA.dummies()
let aClass: AnyClass = arrayOfClasses[0] as! AnyClass // crash!
我终于找到了让它发挥作用的方法,但这看起来太奇怪了,不是正确的方法!
let aClass = NSClassFromString( NSStringFromClass( object_getClass(arrayOfClasses[0]) ))
// aClass is (AnyClass!) $R0 = DummyA
答案 0 :(得分:4)
let arrayOfClasses : [AnyClass] = [UIButton.self, UILabel.self]
let AClass : AnyClass = arrayOfClasses[0]
let button = UIButton()
let ok = button.dynamicType === AClass // true
第1行:如果你没有明确声明arrayOfClasses
的类型,你会得到一个AnyObject的隐式数组,这会让你以后遇到麻烦,因为AnyObject不能是一个类。
第2行:AClass将隐式为AnyClass,这是正确的,但我们需要显式输入以安静地从编译器发出警告。
第3行:那里没问题。
第4行:嗯,基本上你只需知道这是一种询问一种东西是否是另一种给定类型的方法。作为类对象的button
类是它的dynamicType
,所以现在你可以问,这是与任何类对象AClass完全相同的类对象。
let arrayOfClasses = DummyA.dummies()
let AClass : AnyObject = arrayOfClasses[0]
let button = UIButton()
let ok = button.dynamicType === AClass.self