Ich habe diese Definition in meiner Funktion, die funktioniert
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Wenn ich jedoch 'testStr' und 'testStrLen' auf die Klassenebene verschiebe, wird es nicht kompiliert. Es hieß 'MyClass.Type hat kein Mitglied namens' testStr '.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Wie kann ich das beheben? Ich möchte nicht die Strafe dafür zahlen, dass ich jedes Mal die Länge eines konstanten 'Tests' gezählt habe.
Aufgrund meines Verständnisses der folgenden Kommentare muss ich Folgendes tun:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Gibt es eine Möglichkeit, "test" nicht zweimal einzugeben / einzugeben? Vielen Dank.
Antworten:
Vielleicht ist es eine nette Redewendung zum Deklarieren von Konstanten für eine Klasse in Swift, einfach eine Struktur mit dem Namen MyClassConstants wie die folgende zu verwenden.
Auf diese Weise werden Ihre Konstanten innerhalb eines deklarierten Konstrukts erfasst, anstatt global zu schweben.
Aktualisieren
Ich habe eine statische Array-Konstante hinzugefügt, als Antwort auf einen Kommentar zur Initialisierung des statischen Arrays. Siehe Array-Literale in "The Swift Programming Language".
Beachten Sie, dass sowohl String-Literale als auch die String-Konstante zum Initialisieren des Arrays verwendet werden können. Da jedoch der Array-Typ bekannt ist, kann die Ganzzahlkonstante
testStrLength
im Array-Initialisierer nicht verwendet werden.quelle
static
Konstanten inStruct
und inClass
es?MyClassConstants.testStr.rawValue
, auf den Wert zuzugreifen, der nicht so syntaktisch freundlich ist wie nurMyClassConstants.testStr
.Hinzufügen zu @ Martins Antwort ...
Wenn jemand plant, eine konstante Datei auf Anwendungsebene beizubehalten, können Sie die Konstante nach Typ oder Art gruppieren
Anruf :
Constants.MixpanelConstants.activeScreen
UPDATE 05.05.2019 (ein bisschen vom Thema ab, aber 🤷🏽♂️)
Nach dem Lesen einiger Code-Richtlinien und aus persönlichen Erfahrungen scheint es, dass Strukturen aus mehreren Gründen nicht der beste Ansatz zum Speichern globaler Konstanten sind. Insbesondere der obige Code verhindert nicht die Initialisierung der Struktur. Wir können es erreichen, indem wir etwas Boilerplate-Code hinzufügen, aber es gibt einen besseren Ansatz
ENUMS
Dasselbe kann mit einer Aufzählung mit einer sichereren und klareren Darstellung erreicht werden
quelle
Wenn ich Ihre Frage richtig verstehe, fragen Sie sich, wie Sie Konstanten auf Klassenebene (statisch - im C ++ - Sprachgebrauch) so erstellen können, dass Sie nicht a) den Overhead in jedem Fall replizieren und b neu berechnen müssen, was sonst konstant ist.
Die Sprache hat sich weiterentwickelt - wie jeder Leser weiß, aber wenn ich dies in Xcode 6.3.1 teste, lautet die Lösung:
Ich weiß nicht, ob die Statik unbedingt erforderlich ist, da der Compiler dem statischen Abschnitt der Binärdatei sicherlich nur einen Eintrag pro const-Variable hinzufügt, dies wirkt sich jedoch auf die Syntax und den Zugriff aus. Mit static können Sie auch dann darauf verweisen, wenn Sie keine Instanz haben :
MyClass.testStrLen
.quelle
Wenn Sie tatsächlich eine statische Eigenschaft Ihrer Klasse wünschen, wird diese derzeit in Swift nicht unterstützt. Der aktuelle Rat lautet, dies mithilfe globaler Konstanten zu umgehen:
Wenn Sie möchten, dass dies stattdessen Instanzeigenschaften sind, können Sie eine verzögert gespeicherte Eigenschaft für die Länge verwenden. Sie wird nur beim ersten Zugriff ausgewertet, sodass Sie sie nicht immer wieder berechnen.
quelle
Was ist mit berechneten Eigenschaften?
quelle
Einige möchten möglicherweise bestimmte Klassenkonstanten öffentlich, andere privat.
Das private Schlüsselwort kann verwendet werden, um den Umfang der Konstanten in derselben schnellen Datei zu begrenzen.
Andere Klassen können wie unten beschrieben auf Ihre Klassenkonstanten zugreifen
quelle
Versucht auf Spielplatz
quelle