Tengo estas definiciones en mi función que funcionan
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Pero si muevo 'testStr' y 'testStrLen' al nivel de clase, no se compilará. Decía 'MyClass.Type no tiene un miembro llamado' testStr '.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
¿Cómo puedo arreglar esto? No quiero pagar la multa por contar len de una 'prueba' constante cada vez.
Según mi comprensión de los comentarios a continuación, necesito hacer esto:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
¿Hay alguna manera de que no necesite escribir / ingresar "prueba" dos veces? Gracias.
Respuestas:
Quizás un buen modismo para declarar constantes para una clase en Swift es simplemente usar una estructura llamada MyClassConstants como la siguiente.
De esta manera, sus constantes tendrán un alcance dentro de una construcción declarada en lugar de flotar globalmente.
Actualizar
He agregado una constante de matriz estática, en respuesta a un comentario que pregunta sobre la inicialización de matriz estática. Consulte Array Literals en "El lenguaje de programación Swift".
Observe que tanto los literales de cadena como la constante de cadena se pueden usar para inicializar la matriz. Sin embargo, dado que se conoce el tipo de matriz, la constante entera
testStrLength
no se puede utilizar en el inicializador de matriz.fuente
static
constantes enStruct
y enClass
es?MyClassConstants.testStr.rawValue
para acceder al valor, que no es tan amigable sintácticamente como soloMyClassConstants.testStr
.Agregando a la respuesta de @ Martin ...
Si alguien planea mantener un archivo constante a nivel de aplicación, puede agrupar la constante según su tipo o naturaleza.
Llamada :
Constants.MixpanelConstants.activeScreen
ACTUALIZACIÓN 5/5/2019 (un poco fuera de tema pero 🤷🏽♂️)
Después de leer algunas pautas de código y de experiencias personales, parece que las estructuras no son el mejor enfoque para almacenar constantes globales por un par de razones. Especialmente el código anterior no evita la inicialización de la estructura. Podemos lograrlo agregando algún código repetitivo, pero hay un enfoque mejor
ENUMS
Lo mismo se puede lograr usando una enumeración con una representación más segura y clara
fuente
Si entiendo su pregunta correctamente, está preguntando cómo puede crear constantes de nivel de clase (estáticas, en el lenguaje de C ++) de modo que no a) replique la sobrecarga en cada instancia yb tenga que volver a calcular lo que de otro modo es constante.
El lenguaje ha evolucionado, como todos los lectores saben, pero mientras pruebo esto en Xcode 6.3.1, la solución es:
No sé si la estática es estrictamente necesaria, ya que el compilador seguramente solo agrega una entrada por variable constante en la sección estática del binario, pero afecta la sintaxis y el acceso. Mediante el uso de estática, puede hacer referencia a ella, incluso cuando usted no tiene una instancia:
MyClass.testStrLen
.fuente
Si realmente desea una propiedad estática de su clase, actualmente no es compatible con Swift. El consejo actual es solucionarlo mediante el uso de constantes globales:
Si desea que sean propiedades de instancia, puede usar una propiedad almacenada diferida para la longitud; solo se evaluará la primera vez que se acceda a ella, por lo que no la calculará una y otra vez.
fuente
¿Qué pasa con el uso de propiedades calculadas?
fuente
Algunos pueden querer ciertas constantes de clase públicas mientras que otras son privadas.
La palabra clave privada se puede utilizar para limitar el alcance de las constantes dentro del mismo archivo rápido.
Otras clases podrán acceder a sus constantes de clase como se muestra a continuación
fuente
Probé en el patio de recreo
fuente