如何在Swift中创建类数组 [英] How to create a class array in Swift

查看:128
本文介绍了如何在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 from AnyClass. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆