que objetos objective inicializadores cocoa-touch swift

cocoa-touch - objetos - que es self en swift



Obtenga una versiĆ³n legible para el usuario del nombre de la clase en swift(en objc NSStringFromClass estaba bien) (14)

¿Existe un equivalente de NSStringFromClass en Swift que ofrezca una versión legible para el usuario del nombre de la clase? Intenté usarlo con una clase Swift nativa que creé, pero como puede ver, el resultado parece ser la representación interna del compilador del nombre de la clase:

println(NSStringFromClass(MyClass.self))

Resultado:

_TtC5test7MyClass

He intentado agregar el atributo @objc a la clase y convertirlo en una subclase de NSObject, pero no hace ninguna diferencia. Descubrí que si sustituyo MyClass con una clase de Objective-C con el mismo nombre, e importo esto en el encabezado puente, me da ''MyClass'', pero esto no debería ser necesario.

Otra opción sería hacer un protocolo para esto, que cada clase que quiera usar de esta manera debe cumplir con:

protocol Nameable { class var className: String { get } }

Sin embargo, sería más fácil tener una forma integrada de hacerlo en el idioma.



Ahora debes poder usar lo siguiente para recuperar el nombre de la clase de manera rápida

let nameSpaceClassName = NSStringFromClass(RWTCountryPopoverViewController.self) let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String


Ahora puedes simplemente hacer:

String(MyClass)


Aquí está Swift 3+, Xcode 8+ ejemplo con código:

class MySuperbClass{ let a = 4 func getClassName() -> String? { return String(describing: type(of:self)).components(separatedBy: ".").first } } let className = String(describing: type(of:MySuperbClass.self)).components(separatedBy: ".").first //className = "MySuperbClass" let classNameFromObject = MySuperbClass().getClassName() //classNameFromObject = "MySuperbClass"


En Swift 2 beta 4 puede obtener la información a través del tipo de objeto:

let className = "/(String.self)" // gives: "Swift.String"

o si tienes una instancia:

let s = "Hello World" let className = "/(s.dynamicType)" // gives: "Swift.String"

Obtienes el resultado de Module.Class, como:

Swift.String ABC.MyGenericClass<Swift.Int>

Curiosamente, el objeto Tipo devuelto no parece cumplir con el protocolo CustomStringConvertible. Por lo tanto, no tiene propiedad de ''descripción'', aunque el patrón "" todavía hace lo correcto.

PD: antes de b4, lo mismo podría lograrse a través de reflect (obj.dynamicType) .summary.


En Swift v3.0, esto funcionó para mí:

String.init(describing: self.self)


Esto es un poco más corto. No hay necesidad de NSStringFromClass

MyObject.self.description().componentsSeparatedByString(".").last!


Nuevo formato basado en xcode 6 beta 5.

(project_name). (class_name)

func getName(classType:AnyClass) -> String { let classString = NSStringFromClass(classType.self) let range = classString.rangeOfString(".", options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start:classString.startIndex, end: classString.endIndex), locale: nil) return classString.substringFromIndex(range!.endIndex) }

Las últimas 6.3 Xcode Swift 1.2

Si necesita una extensión o puede poner esto en cualquier objeto común:

public extension NSObject{ public class var nameOfClass: String{ return NSStringFromClass(self).componentsSeparatedByString(".").last! } public var nameOfClass: String{ return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last! } }


Por el momento, no hay una manera confiable de hacer esto. Vea el comentario de un desarrollador de Apple en https://devforums.apple.com/thread/227425

Swift no tiene actualmente mucho en el camino de la introspección.

Hay alguna maquinaria de introspección que se utiliza para los patios de recreo. No sé si eso pretende ser API.

Algunos métodos y variables de Swift se pueden examinar utilizando la introspección del tiempo de ejecución de Objective-C. Esa es probablemente la mejor solución hoy.

Swift tiene la noción de un metatipo, algo similar al tipo de clase en Objective C. Puede encontrarlo usando TypeName.self , por ejemplo:

class Foo { @required init() { } } var normalFoo : Foo = Foo() var fooType : Foo.Type = Foo.self; var fooFromMetatype : Foo = fooType();

Quizás, para el tiempo de lanzamiento, los metatipos incluirán más habilidades de introspección. Sugiero presentar una solicitud de función de radar para esto.


Si desea tener solo el nombre de la clase en swift, puede analizar la cadena devuelta por NSStringFromClass ().

Esto se hace en nameOfClass.swift del repositorio INSwift Github: https://github.com/indieSoftware/INSwift


Swift 3

NSStringFromClass(self).components(separatedBy: ".").last!


Swift 4

super.init(nibName:String(describing:MyClass.self), bundle: nil)


Swift 3

type(of: self) imprime ModuleName.ClassName

String(describing: type(of: self)) imprime ClassName


myObject.description().componentsSeparatedByString(" ").first!

Esto no es exactamente lo que desea, agregará un encabezado no deseado ''<'' y rastrear '':''. Pero cuando estoy depurando, valoro la velocidad por encima de la nitidez, así que este truco rápido + sucio me funcionó.