objective c - Globos rápidos y funciones globales en el objetivo c.
objective-c swift (2)
Buena respuesta por @rintaro, pero otra alternativa Swift sencilla para las constantes que se pueden usar tanto en Swift como en Objective-C:
@objcMembers
class MyConstants: NSObject {
static let kMyConstant1 = "ConstantValue1";
static let kMyConstant2 = "ConstantValue2";
static let CARDS = ["card1", "card2"]
}
Puede acceder a esto tanto en Swift como en Objective-C mediante:
MyConstants.kMyConstant1 // this will return "ConstantValue1"
MyConstants.CARDS // this will return array ["card1", "card2"]
la documentación dice:
Las constantes globales definidas en C y los archivos fuente de Objective-C son importadas automáticamente por el compilador Swift como constantes globales Swift.
Pero no dice nada al revés. Necesito definir una constante global rápida y poder verla en el lado objetivo como una constante global. Como en el lado rápido define:
public let CARDS = ["card1", "card2"]
y ver usarlo en el lado c objetivo como
NSLog(@"Cards count: %d", [CARDS count])
¿Qué tengo que hacer? Ya he importado el encabezado Swift generado automáticamente como:
#import "MyProject-Swift.h"
y en Xcode, si hago un command-click
en él, me lleva al lugar correcto en el código Swift, pero en el momento de la compilación obtengo:
''User of undeclared Identifier CARDS''
en mi lado c objetivo.
Aquí está el documento al respecto.
Tendrás acceso a cualquier cosa dentro de una clase o protocolo que esté marcado con el atributo @objc siempre que sea compatible con Objective-C. Esto excluye las funciones solo de Swift, como las que se enumeran aquí:
- Genéricos
- Tuplas
- Enumeraciones definidas en Swift
- Estructuras definidas en Swift
- Funciones de primer nivel definidas en Swift
- Variables globales definidas en Swift
- Tipografías definidas en Swift
- Variados de estilo rápido
- Tipos anidados
- Funciones al curry
Las variables globales (incluidas las constantes) son inaccesibles desde Objective-C.
En su lugar, debe declarar una clase que tenga accesores para las constantes globales.
// Swift
public let CARDS = ["card1", "card2"]
@objc class AppConstant {
private init() {}
class func cards() -> [String] { return CARDS }
}
// Objective-C
NSArray *cards = [AppConstant cards];