La declaración de value
abajo
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
provoca el siguiente error de compilación
A declaration cannot be both 'final' and 'dynamic'
¿Por qué sucede esto y cómo puedo lidiar con esto?
Estoy usando Swift 1.2 (la versión incluida en Xcode 6.3.1 6D1002)
swift
compiler-errors
eonil
fuente
fuente
func test2
declaración no es necesaria para activar el error, a partir de Xcode 7.3.1.Respuestas:
Este problema surge porque Swift está intentando generar un acceso dinámico para la propiedad estática para la compatibilidad Obj-C, ya que la clase hereda de
NSObject
.Si su proyecto está solo en Swift, en lugar de usar un
var
descriptor de acceso, puede evitar el problema a través del@nonobjc
atributo en Swift 2.0:fuente
AAA
aquí), ¿así que supongo que estoy en claro?NSManagedObject
subclase. Esto lo solucionó!Obtendrá este error si su clase cumple con estas condiciones.
NSObject
.static let
campo.dynamicType
.No sé por qué sucede esto, pero puedes probar esta solución.
O en forma más corta.
Usar en
static var { get }
lugar destatic let
.Aunque es muy probable que el optimizador de LLVM elimine el captador de propiedades y su costo de llamadas en el ejemplo anterior, es posible que desee evitarlo explícitamente.
Si le preocupa el costo de cálculo de dicho valor, puede crearlo una vez y almacenarlo en caché de esta manera.
O así si quieres ocultar la existencia de caché por completo.
fuente
private static let _value: Int = 111
static var value: Int { return _value }
no tiene elget {
pero el compilador menciona algo sobre la propiedad calculada si uso envar
lugar delet
get
en este caso está implícito. Lo que puede hacer en su lugar es asignar el resultado del cierre de la variable de manera que el cierre se llama una sola vez:let value: Int = { return 111 }()
. Los corchetes al final llaman al cierre. Pero tenga en cuenta que esta es una propiedad almacenada nuevamente y, por lo tanto, no está disponible en extensiones.También tuve este error.
Mi problema era solo una var estática en una extensión rápida.
Moverlo a la implementación de clase resolvió el problema para mí.
fuente
Acabo de tropezar con el mismo problema con una causa diferente y me gustaría publicarlo aquí para otras personas que experimentan el mismo mensaje de error inútil.
Una clase final que anula una variable calculada definida en una extensión también causa este error. Sin embargo, funciona para funciones y, por lo tanto, parece un error del compilador.
fuente
Resolví este problema moviendo la declaración estática a la nueva estructura que definí en la extensión.
Entonces, en lugar de esto:
Tengo esto:
fuente
Puede marcarlo como privado para evitar este error. Si desea exponerlo, puede envolverlo en una función pública:
En mi caso, solo hice referencia a la propiedad en la extensión misma, por lo que no había necesidad de exponerla.
fuente
Como una ligera mejora con respecto a la respuesta de @ Eonil ,
get
no es necesario:fuente