A declaração value
abaixo
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
causa o seguinte erro de compilação
A declaration cannot be both 'final' and 'dynamic'
Por que isso acontece e como posso lidar com isso?
Estou usando o Swift 1.2 (a versão fornecida no Xcode 6.3.1 6D1002)
swift
compiler-errors
eonil
fonte
fonte
func test2
declaração não é necessária para acionar o erro, a partir do Xcode 7.3.1.Respostas:
Esse problema ocorre porque o Swift está tentando gerar um acessador dinâmico para a propriedade estática para compatibilidade com Obj-C, já que a classe é herdada
NSObject
.Se o seu projeto estiver apenas no Swift, em vez de usar um
var
acessador, você poderá evitar o problema pelo@nonobjc
atributo no Swift 2.0:fonte
AAA
aqui), então acho que estou livre?NSManagedObject
subclasse. Isso consertou!Você receberá esse erro se sua turma atender a essas condições.
NSObject
.static let
campodynamicType
.Não sei por que isso acontece, mas você pode tentar esta solução alternativa.
Ou em forma mais curta.
Use em
static var { get }
vez destatic let
.Embora o getter de propriedades e seu custo de chamada provavelmente sejam eliminados pelo otimizador LLVM no exemplo acima, convém evitá-lo explicitamente.
Se você estiver preocupado com esse custo de cálculo de valor, poderá criá-lo uma vez e fazer o cache assim.
Ou assim, se você deseja ocultar completamente a existência do cache.
fonte
private static let _value: Int = 111
static var value: Int { return _value }
ele não tem oget {
mas o compilador menciona algo sobre propriedade computada se eu usarvar
em vez delet
get
está implícito neste caso. O que você pode fazer é em vez de atribuir o resultado do fechamento para a variável de modo que o encerramento é chamado apenas uma vez:let value: Int = { return 111 }()
. Os colchetes no final chamam de fechamento. Mas lembre-se de que essa é uma propriedade armazenada novamente e, portanto, não está disponível em extensões.Eu também tive esse erro.
Meu problema foi apenas uma var estática em uma extensão rápida.
Mover para a implementação da classe resolveu o problema para mim.
fonte
Acabei de me deparar com o mesmo problema com uma causa diferente e gostaria de publicá-lo aqui para outras pessoas com a mesma mensagem de erro inútil.
Uma classe final que substitui uma variável computada definida em uma extensão também causa esse erro. Ele funciona para funções e, portanto, parece um bug do compilador.
fonte
Resolvi esse problema movendo a declaração estática para a nova estrutura que defini na extensão.
Então, em vez disso:
Eu tenho isto:
fonte
Você pode marcá-lo como privado para evitar esse erro. Se você deseja expô-lo, pode envolvê-lo em uma função pública:
No meu caso, apenas referenciei a propriedade na própria extensão, portanto, não houve necessidade de expô-la.
fonte
Como uma ligeira melhora em relação à resposta de @ Eonil , o
get
não é necessário:fonte