如何在Swift中创建类数组 [英] How to create a class array in Swift
问题描述
在目标c中,我可以创建一个类数组并在方法中使用它。
NSArray * classes = @ [ NSAttributedString class]];
NSArray * items = [pasteboard readObjectsForClasses:classes
options:nil];
但是,swift没有类功能。返回类的元类型会导致错误
let aClass:AnyClass! = NSAttributedString.self
//或让aClass:AnyClass! = NSAttributedString.classForArchiver()
let pasteboard = NSPasteboard.generalPasteboard()
let classes = [aClass]
let objects = pasteboard.readObjectsForClasses (classes,options:nil)
最后一行结果是fatal error:array element can not be bridged to Objective-C
如何在Swift中创建类数组?
我已经找到一个纯粹的Swift hack:
func classFromType< T:NSObject>(type:T.Type) AnyObject! {
return T.valueForKey(self)//请求类间接...
}
var clazz:AnyObject = classFromType(NSAttributedString.self)
var classes = [clazz]
上一个答案 b
$ b
我无法通过Swift中的任何方法获得 Class
实例。它似乎不能直接从 AnyClass
转换。例如,以下是不可能的(在运行时会崩溃)
var classes:NSMutableArray = []
classes .addObject(NSClassFromString(NSAttributedString.className()))
所以我进入Obj-一个简单的 NSMutableArray
类别:
@implementation NSMutableArray
$ b - (void)addClassByName:(NSString *)className {
[self addObject:NSClassFromString(className)];
}
@end
然后
var classes:NSMutableArray = []
classes.addClassByName(NSAttributedString.className())
可以工作,但有点黑客。
In objective c, I could create a class array and use it in a method
NSArray *classes = @[[NSAttributedString class]]; NSArray *items = [pasteboard readObjectsForClasses:classes options:nil];
However, swift has no "class" function. Returning a Metatype for a class results in an error
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)
the final line results in "fatal error: array element cannot be bridged to Objective-C"
How can I create a class array in Swift?
解决方案Apparently, this has been fixed in Beta 3 so there is no need for workarounds anymore
I have found a pure 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]
Previous answer
I wasn't able to get the
Class
instance by any means in Swift. It seems it cannot be converted directly fromAnyClass
. For example, the following is not possible (will crash at runtime)var classes: NSMutableArray = [] classes.addObject(NSClassFromString(NSAttributedString.className()))
So I went into Obj-C and defined a simple
NSMutableArray
category:@implementation NSMutableArray (ClassArray) - (void)addClassByName:(NSString *)className { [self addObject:NSClassFromString(className)]; } @end
Then
var classes: NSMutableArray = [] classes.addClassByName(NSAttributedString.className())
works but it is a bit of a hack.
这篇关于如何在Swift中创建类数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!