如何在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中运行它。但是,如果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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在一个线程中修改变量并在另一个线程中检查变量?

如何在Go中的另一个包中声明具有类型的变量?

Python在另一个变量中检查变量

如何在Swift中从不同的句柄中引用另一个变量

如何检查变量是否等于数组中的另一个变量

如何在另一个JavaScript中访问一个JavaScript中的变量?

如何在一个类中的另一个函数中更新变量?

如何在EEx中的<%= render ...%>中使用另一个变量中的变量

如何在另一个网页中访问一个PHP变量

如何在另一个PHP文件中显示一个PHP变量?

如何在 Kotlin 中为变量分配另一个变量的值?

如何在JavaScript中通过另一个变量递增变量

如何在动态sql中设置包含另一个变量的变量

如何在tidyverse中每组另一个变量创建虚拟变量

如何在SCSS中的另一个变量中使用变量

如何在Julia中针对另一个离散变量绘制离散变量?

如何在Azure DevOps中的另一个变量中使用变量

如何在另一个“插入”查询中使用“记录”类型变量的字段?

在Swift中从另一个ViewController访问变量

Swift:在另一个场景中更新了变量

如何在python中轻松地将一个变量的属性传递给另一个变量?

如何在Python中设置一个变量大于另一个变量?

如何在_config.yml中从另一个变量创建一个Jekyll变量?

一个如何在R中的另一个变量下分支多个变量?

如何在tcsh中实现变量间接寻址(指的是名称存储在另一个变量中的变量)

如何在Excel中使一个变量与另一个变量保持不变

如何在另一个变量的基础上注册一个变量?

如何在一个文件中调用一个声明的变量到另一个文件?

如何在javascript中更改另一个文件中的文件中的值变量