我有一个类数组,我想检查某个变量是否匹配该数组中的某个元素。这就是我在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中运行它。但是,如果arrayOfClasses
是在Objective-C中创建的,则会崩溃并显示error Could not cast value of type 'DummyA' (0x1049f48a0) to 'Swift.AnyObject.Type'
。这是有道理的,因为Objective-C类现在是一个快速的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
整rick,不是吗?我认为这可以做到:
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是。
编辑:您已经编辑了问题,以便类数组来自Objective-C,但我看不到它是如何真正改变的:
let arrayOfClasses = DummyA.dummies()
let AClass : AnyObject = arrayOfClasses[0]
let button = UIButton()
let ok = button.dynamicType === AClass.self
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句