Die Erklärung von value
unten
import Foundation
class AAA: NSObject {
func test2() {
self.dynamicType
}
}
extension AAA {
static let value = 111
}
verursacht den folgenden Kompilierungsfehler
A declaration cannot be both 'final' and 'dynamic'
Warum passiert das und wie kann ich damit umgehen?
Ich verwende Swift 1.2 (die in Xcode 6.3.1 6D1002 enthaltene Version)
swift
compiler-errors
eonil
quelle
quelle
func test2
Deklaration wird ab Xcode 7.3.1 nicht benötigt, um den Fehler auszulösen.Antworten:
Dieses Problem tritt auf, weil Swift versucht, einen dynamischen Accessor für die statische Eigenschaft für die Obj-C-Kompatibilität zu generieren, da die Klasse von erbt
NSObject
.Wenn sich Ihr Projekt nur in Swift befindet, anstatt einen
var
Accessor zu verwenden, können Sie das Problem über das@nonobjc
Attribut in Swift 2.0 vermeiden :quelle
AAA
hier), also bin ich wohl im klaren?NSManagedObject
Unterklasse statische (Klassen-) Variablen hinzuzufügen . Das hat es behoben!Sie erhalten diesen Fehler, wenn Ihre Klasse diese Bedingungen erfüllt.
NSObject
.static let
Feld.dynamicType
.Ich weiß nicht, warum dies passiert, aber Sie können diese Problemumgehung ausprobieren.
Oder in kürzerer Form.
Verwenden Sie
static var { get }
anstelle vonstatic let
.Obwohl Property Getter und seine Aufrufkosten im obigen Beispiel sehr wahrscheinlich vom LLVM-Optimierer eliminiert werden, möchten Sie dies möglicherweise explizit vermeiden.
Wenn Sie über solche Wertberechnungskosten besorgt sind, können Sie sie einmal erstellen und so zwischenspeichern.
Oder so, wenn Sie die Existenz des Caches vollständig verbergen möchten.
quelle
private static let _value: Int = 111
static var value: Int { return _value }
es hat nicht das,get {
aber der Compiler erwähnt etwas über berechnete Eigenschaft, wenn ichvar
anstelle vonlet
get
in diesem Fall implizit ist. Sie können stattdessen das Ergebnis des Abschlusses der Variablen zuweisen, sodass der Abschluss nur einmal aufgerufen wird :let value: Int = { return 111 }()
. Die Klammern am Ende rufen den Verschluss auf. Beachten Sie jedoch, dass dies wieder eine gespeicherte Eigenschaft ist und daher in Erweiterungen nicht verfügbar ist.Ich hatte auch diesen Fehler.
Mein Problem war nur eine statische Variable in einer schnellen Erweiterung.
Das Verschieben in die Klassenimplementierung hat das Problem für mich gelöst.
quelle
Ich bin gerade über dasselbe Problem mit einer anderen Ursache gestolpert und möchte es hier für andere Personen veröffentlichen, bei denen dieselbe nutzlose Fehlermeldung auftritt.
Eine letzte Klasse, die eine in einer Erweiterung definierte berechnete Variable überschreibt, verursacht ebenfalls diesen Fehler. Es funktioniert jedoch für Funktionen und sieht daher wie ein Compiler-Fehler aus.
quelle
Ich habe dieses Problem gelöst, indem ich die statische Deklaration in die neue Struktur verschoben habe, die ich in der Erweiterung definiert habe.
Also stattdessen:
Ich habe das:
quelle
Sie können es als privat markieren, um diesen Fehler zu vermeiden. Wenn Sie es verfügbar machen möchten, können Sie es in eine öffentliche Funktion einschließen:
In meinem Fall habe ich nur auf die Eigenschaft in der Erweiterung selbst verwiesen, sodass sie nicht verfügbar gemacht werden musste.
quelle
Als leichte Verbesserung gegenüber @ Eonils Antwort ist das
get
nicht notwendig:quelle