objective-c swift global-variables

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];