Oświadczenie value
poniżej
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
powoduje następujący błąd kompilacji
A declaration cannot be both 'final' and 'dynamic'
Dlaczego tak się dzieje i jak sobie z tym radzić?
Używam Swift 1.2 (wersja dostarczana z Xcode 6.3.1 6D1002)
swift
compiler-errors
eonil
źródło
źródło
func test2
Deklaracja nie jest potrzebne, aby wywołać błąd, ponieważ z Xcode 7.3.1.Odpowiedzi:
Ten problem występuje, ponieważ Swift próbuje wygenerować dynamiczny akcesor dla właściwości statycznej w celu zapewnienia zgodności z Obj-C, ponieważ klasa dziedziczy z
NSObject
.Jeśli Twój projekt jest tylko w języku Swift, zamiast używać
var
akcesorium, możesz uniknąć problemu za pomocą@nonobjc
atrybutu w języku Swift 2.0:źródło
AAA
tutaj), więc myślę, że wszystko jest jasne?NSManagedObject
podklasy. To naprawiło!Ten błąd zostanie wyświetlony, jeśli Twoja klasa spełnia te warunki.
NSObject
.static let
pole.dynamicType
.Nie wiem, dlaczego tak się dzieje, ale możesz wypróbować to obejście.
Lub w krótszej formie.
Użyj
static var { get }
zamiaststatic let
.Chociaż funkcja pobierająca właściwość i jej koszt wywołania z dużym prawdopodobieństwem zostaną wyeliminowane przez optymalizator LLVM w powyższym przykładzie, możesz chcieć jawnie tego uniknąć.
Jeśli obawiasz się takiego kosztu obliczenia wartości, możesz go utworzyć raz i zapisać w pamięci podręcznej w ten sposób.
Lub w ten sposób, jeśli chcesz całkowicie ukryć istnienie pamięci podręcznej.
źródło
private static let _value: Int = 111
static var value: Int { return _value }
nie ma,get {
ale kompilator wspomina coś o właściwości obliczonej, jeślivar
let
get
w tym przypadku jest to niejawne. Co można zrobić, a nie tylko przypisać wynikiem zamknięcia do zmiennej tak, że zamknięcie jest wywoływana tylko raz:let value: Int = { return 111 }()
. Nawiasy na końcu nazywają zamknięcie. Należy jednak pamiętać, że jest to ponownie przechowywana właściwość i dlatego nie jest dostępna w rozszerzeniach.Ja też miałem ten błąd.
Mój problem był po prostu statyczną zmienną w szybkim rozszerzeniu.
Przeniesienie go do implementacji klasy rozwiązało problem za mnie.
źródło
Właśnie natknąłem się na ten sam problem z inną przyczyną i chciałbym opublikować go tutaj dla innych osób, które mają ten sam bezużyteczny komunikat o błędzie.
Ostatnia klasa, która przesłania obliczoną zmienną zdefiniowaną w rozszerzeniu, również powoduje ten błąd. Działa jednak dla funkcji i dlatego wygląda jak błąd kompilatora.
źródło
Rozwiązałem ten problem, przenosząc deklarację statyczną do nowej struktury, którą zdefiniowałem w rozszerzeniu.
Więc zamiast tego:
Mam to:
źródło
Możesz oznaczyć go jako prywatny, aby zapobiec występowaniu tego błędu. Jeśli chcesz go ujawnić, możesz umieścić go w funkcji publicznej:
W moim przypadku odwołałem się do właściwości tylko w samym rozszerzeniu, więc nie było potrzeby, aby go ujawniać.
źródło
Jako niewielka poprawa w stosunku do odpowiedzi @ Eonil ,
get
nie jest konieczne:źródło