gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:33:54 26 4
gpt4 key购买 nike

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


更新:感谢@matt,我现在知道如何让它在纯 Swift 中工作。但是,如果 arrayOfClasses 是在 Objective-C 中创建的,它会崩溃并出现错误 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

最佳答案

很棘手,不是吗?我认为这会做到:

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的类(class),作为类对象,是它的 dynamicType ,所以现在您可以问,这是与 AClass 的任何类对象完全相同的类对象吗?


编辑:您已经编辑了问题,以便类数组来自 Objective-C,但我看不出这有什么真正的改变:

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

关于swift - 如何在 Swift 中检查一个变量与另一个变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com