2017-04-15 5 views
-1

Ich arbeite an einem Projekt in Swift, das mehrere Swift-Dateien mit jeweils einer Klasse enthält. Mein Ziel ist es, einige Klassen zu haben, die Eigenschaften von den anderen erben. Aus irgendeinem Grund kann ich nicht auf die Variablen einer Klasse aus einer anderen Klasse zugreifen. Zum Beispiel, hier ist eine Datei:Variable mit schnellen Klassen erben

class Enemy { 
    var ready = false 
    var someVal = 0 

    func someFunctions() { 
    } 
} 

In einer anderen Datei, habe ich versucht, eine Klasse zu erstellen, die von „Feind“ erbt

class badGuy: Enemy { 
    ready = true // This doesn't work as I would expect it to 

    func badGuyFunction() { 
    } 
} 

Wenn ich versuche, die Variablen für den Zugriff auf someVal oder ready Von beiden Klassen bekomme ich einen Fehler.

class randomClass { 
    func test() { 
     print(Enemy.ready) //This doesn't work 
     print (badGuy.ready) // This doesn't work 
    } 
} 

Was mache ich hier falsch? Ich habe versucht, init() Funktionen in jeder der Klassen zu verwenden, aber das funktioniert nicht. Nur um zu verdeutlichen, möchte ich eine Basisklasse haben, dann eine Unterklasse haben, deren "Typ" die Basisklasse ist, und dann in der Unterklasse Werte für jede der Variablen definieren, die die Basisklasse unterstützt. badGuy sollte automatisch in der Lage sein, eigene someVal zu setzen. Danke im Voraus.

+0

Danke. Ich habe den Fehler beim Kompilieren gefunden. – Jake3231

+0

Was meinst du mit "funktioniert nicht"? Bitte geben Sie eine * tatsächliche * Problembeschreibung an. Wenn Sie Compilerfehler erhalten, zeigen Sie bitte diese Fehler an. – Hamish

+0

Okay. Wenn ich in 'randomClass' gehe und' enemy' gebe, wird 'ready' nicht als Autocomplete angeboten. Wenn ich es erzwinge, sagt der Compiler: "Instance member ready kann nicht für den Typ badGuy verwendet werden" – Jake3231

Antwort

4

Sie sind sehr nah dran. Mit ein paar kleinen Änderungen funktioniert es so, wie Sie es vorhaben.

Hier ist die neue Enemy Klasse, die fast identisch mit Ihrem Original ist.

class Enemy { 

    var ready = false 
    var someVal = 0 

    func someFunction() {} 

} 

Die BadGuy Unterklasse seine Eigenschaften in seinem initializer einstellen.

class BadGuy: Enemy { 

    override init() { 
     super.init() 
     ready = true 
    } 

    func badGuyFunction() {} 

} 

Und dann sollten Sie in der Lage sein, sie wie folgt zu verwenden:

let badGuy = BadGuy() 
print(badGuy.ready) // prints `true` 
+1

Danke! Ich kann bestätigen, dass dies für mich funktioniert hat! – Jake3231

1

Ausgabe # 1 tritt auf, weil Sie Überschreibungready im init Verfahren haben

class Enemy { 
    var ready = false 
} 

class BadGuy: Enemy { 

    override init() { 
     super.init() 
     ready = true 
    } 
} 

Gespeicherte Eigenschaften können nicht direkt überschrieben werden.


Issue # 2 tritt auf, weil Sie auf dem Typ die Instanz Methode aufrufen. Sie müssen Instanzen der Klassen erstellen.

class RandomClass { 
    func test() { 
     let enemy = Enemy() 
     let badGuy = BadGuy() 
     print(enemy.ready) 
     print(badGuy.ready) 
    } 
} 

let randomClass = RandomClass() 
randomClass.test() // prints two lines `false` and `true` 
+0

Danke. Das macht Sinn!Ich weiß nicht, wie ich die Tatsache vermisst habe, dass ich einen Typ benutzt habe! – Jake3231

Verwandte Themen