一尘不染

如何在Swift中创建类数组

swift

在目标c中,我可以创建一个类数组并在方法中使用它

NSArray *classes = @[[NSAttributedString class]];
NSArray *items = [pasteboard readObjectsForClasses:classes
                                           options:nil];

但是,swift没有“类”功能。返回类的元类型会导致错误

    let aClass : AnyClass!  = NSAttributedString.self
    //or let aClass:AnyClass! = NSAttributedString.classForArchiver()

    let pasteboard = NSPasteboard.generalPasteboard()

    let classes = [aClass]

    let objects = pasteboard.readObjectsForClasses(classes, options: nil)

最后一行导致“致命错误:数组元素无法桥接到Objective-C”

如何在Swift中创建类数组?


阅读 270

收藏
2020-07-07

共1个答案

一尘不染

显然,此问题已在Beta 3中修复,因此不再需要解决方法

我发现了一个纯粹的Swift hack:

func classFromType<T: NSObject>(type: T.Type) -> AnyObject! {
    return T.valueForKey("self") //ask for class indirectly...
}

var clazz: AnyObject = classFromType(NSAttributedString.self)
var classes = [clazz]

先前的答案

我无法Class在Swift中以任何方式获取实例。似乎无法直接从转换AnyClass。例如,以下操作是不可能的(将在运行时崩溃)

var classes: NSMutableArray = []
classes.addObject(NSClassFromString(NSAttributedString.className()))

因此,我进入了Obj-C并定义了一个简单的NSMutableArray类别:

@implementation NSMutableArray (ClassArray)

- (void)addClassByName:(NSString *)className {
    [self addObject:NSClassFromString(className)];
}

@end

然后

var classes: NSMutableArray = []
classes.addClassByName(NSAttributedString.className())

可以,但是有点hack。

2020-07-07