objetos inicializadores clases class swift

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.