Comienzo mi proyecto con un controlador de vista dividida como controlador de vista inicial y lo inicio automáticamente desde el guión gráfico.
Generalmente, una aplicación con esta interfaz de usuario tiene uno y solo un controlador de vista dividida como raíz, por lo que creo una variable estática en la subclase y la configuro cuando se realizó la inicialización.
Así que quiero probar este comportamiento con rapidez.
Leí la guía del lenguaje de programación Swift en el iBook sobre las propiedades de tipo (con palabras clave estáticas y de clase) y probé un fragmento de código para el trabajo:
import UIKit
class SplitViewController: UISplitViewController {
class func sharedInstance() -> SplitViewController {
return SplitViewController.instance
}
class let instance: SplitViewController = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialization()
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder);
self.initialization()
}
func initialization() {
SplitViewController.instance = self;
}
}
pero descubrí cuando Xcode dice que la palabra clave de clase para las propiedades de tipo aún no es compatible.
¿Tenías una solución para hacer esto?
Respuestas:
Swift ahora tiene soporte para variables estáticas en clases. Esto no es exactamente lo mismo que una variable de clase (porque no las heredan las subclases), pero te acerca bastante:
fuente
class
palabra clave solo se puede usar para propiedades calculadas ahora y estática para todas las propiedades de tipo (en enum, class or struct)Incrustar una estructura puede funcionar bien como solución alternativa:
La propiedad de tipo calculado SomeClass.workaroundClassVariable se puede utilizar como si fuera una propiedad de tipo almacenada.
fuente
Parece ser posible declarar variables con duración de almacenamiento estático en el alcance del archivo (como en C):
fuente
private
.Mi método preferido es simplemente usar un ámbito de archivo privado var fuera de la clase y luego implementar captadores y definidores de clase / estáticos:
fuente
A partir de Swift 1.2 (disponible con Xcode 6.3b1 y posteriores),
static
se admiten las propiedades y métodos de clase.fuente
class
variable, o hay una distinción (solía serstatic
para estructuras,class
para clases)?static
es un alias declass final
.Usando un modelo de singleton dispatch_once en Swift
Parece ser la mejor respuesta hasta ahora, evitando el uso de una variable global.
fuente
Una solución lo suficientemente similar a var en el alcance del archivo pero más personalizable y cercana al singleton es usar una estructura que admita var estática como propiedad de la clase
fuente
Ok, con la solución de Nikolai que hace el trabajo. Publico mis cambios en este hilo para obtener información.
y por ejemplo, en mi appDelegate, puedo acceder a este método estático como este
fuente
La redacción del error implica en gran medida que será una característica del idioma en el futuro.
Es posible que desee recurrir temporalmente a declarar una variable de propiedad en el Delegado de aplicación y recuperarla desde allí. No es ideal, definitivamente un anti-patrón, pero le daría un lugar central para recuperarlo
UISplitViewController
cuando sea necesario.fuente
Tienes que envolver las variables de clase dentro de una variable de estructura interna
fuente
Prueba esto:
fuente
Se llama Propiedad de tipo en Swift.
Lea más en el enlace a continuación,
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254
fuente