如何在Swift中检查变量的类型与另一个变量

时间:2015-06-03 22:47:54

标签: swift

我有一个类数组,我想检查某个变量是否与该数组中的某个元素匹配。这就是我在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! AnyClassas! AnyClass.Typeas! 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

1 个答案:

答案 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完全相同的类对象。

编辑:您已编辑了问题,以便类的数组来自Objective-C,但我看不出它是如何真正改变的:

let arrayOfClasses = DummyA.dummies()
let AClass : AnyObject = arrayOfClasses[0]
let button = UIButton()
let ok = button.dynamicType === AClass.self