class - clases - inicializadores swift
Cómo crear una matriz de clase en Swift (3)
En el objetivo c, podría crear una matriz de clase y usarla en un método
NSArray *classes = @[[NSAttributedString class]];
NSArray *items = [pasteboard readObjectsForClasses:classes
options:nil];
Sin embargo, swift no tiene función de "clase". Devolver un metatipo para una clase da como resultado un 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)
la línea final da como resultado "error grave: el elemento de la matriz no se puede conectar a Objective-C"
¿Cómo puedo crear una matriz de clase en Swift?
Parece que el array array funciona en AnyObject, pero tu aClass no es AnyObject, ¡es AnyClass! - el seguimiento de la pila en el error dice
Swift._arrayBridgeToObjectiveC <A, B>(Swift.Array<A>) -> Swift.Array<B> ()
y el ensamblador antes de que pare, parece como si estuvieran atrapando deliberadamente en él no siendo AnyObject.
Cambiando tu código a
var classAsAnyObject : AnyObject = aClass as AnyObject
//var classes = [aClass]
var classes = [classAsAnyObject]
provoca un bloqueo inmediato en objc_retain, al igual que
var array = NSArray(object:aClass)
Así que supongo que es algo que ver con ARC y clases.
El manejo de clases como objetos en Swift parece oscuro, por decir lo menos.
No responde la pregunta real (cómo crear una matriz de clases), pero para la aplicación que usaste como ejemplo, podrías evitarlo haciendo algo como:
var pasteboard = NSPasteboard.generalPasteboard()
let allObjects = pasteboard.pasteboardItems
println("allObjects=/(allObjects)")
for item : AnyObject in allObjects {
println("item=/(object_getClassName(item))")
if let pbi = item as? NSPasteboardItem {
println("item.types=/(pbi.types)")
let str = pbi.stringForType("public.utf8-plain-text")
println("item as string /(str)")
}
}
en Swift 2.0 puedes usar
let urls = _pasteboard.readObjectsForClasses([NSURL.self, NSString.self], options: nil)
como <ClassName>.self
AnyClass
devuelve el valor de AnyClass
Aparentemente, esto se ha solucionado en Beta 3, por lo que ya no hay necesidad de soluciones
He encontrado un hack Swift puro:
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]
Respuesta anterior
No pude obtener la instancia de la Class
de ninguna manera en Swift. Parece que no se puede convertir directamente desde AnyClass
. Por ejemplo, lo siguiente no es posible (se bloqueará en el tiempo de ejecución)
var classes: NSMutableArray = []
classes.addObject(NSClassFromString(NSAttributedString.className()))
Así que entré en Obj-C y NSMutableArray
categoría simple de NSMutableArray
:
@implementation NSMutableArray (ClassArray)
- (void)addClassByName:(NSString *)className {
[self addObject:NSClassFromString(className)];
}
@end
Entonces
var classes: NSMutableArray = []
classes.addClassByName(NSAttributedString.className())
Funciona pero es un poco de un hack.