2014-06-10 22 views
6

ich mich nur fragen, warum ich nicht so etwas wie dies direkt unter meiner Klasse Erklärung in Swift tun kann:Probleme mit Swift Erklärung

let width = 200.0 
let height = 30.0 

let widthheight = width-height 

ich eine Konstante mit 2 anderen Konstanten nicht erstellen kann. Wenn ich das innerhalb einer Funktion/Methode verwende, funktioniert alles gut.

Dank

+0

Was Sie als Fehler erhalten? Es funktioniert hier. – Mani

+0

besser, dieses zu lesen https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-XID_1 –

+0

@Mani The OP bedeutet ** in einer Klasse **. –

Antwort

11

Wenn Sie let widthheight = width - height schreiben, bedeutet dies implizit let widthheight = self.width - self.height. In Swift dürfen Sie einfach self nicht verwenden, bis alle ihre Mitglieder initialisiert wurden - einschließlich widthheight.

Sie haben ein wenig mehr Flexibilität in einem init Verfahren, obwohl, wo man Dinge wie diese schreiben kann:

wie das
class Rect { 

    let width = 200.0 
    let height = 30.0 
    let widthheight: Double 
    let widthheightInverse: Double 

    init() { 
     // widthheightInverse = 1.0/widthheight // widthheight not usable yet 
     widthheight = width - height 
     widthheightInverse = 1.0/widthheight // works 
    } 

} 
-2

Für Dinge, Sie Verwendung von Klassenvariablen machen könnte. Der Code würde wie folgt aussehen:

class var width = 200.0 
class var height = 30.0 
class var widthheight = width - height 

Aber wenn Sie es versuchen, werden Sie einen Compiler-Fehler sehen:

Class variables are not yet supported

Ich denke, sie haben nicht umgesetzt, die noch verfügen. Aber es gibt eine Lösung für den Moment. Bewegen Sie einfach Ihre Erklärungen außerhalb der Klassendeklaration wie folgt vor:

let width = 200.0 
let height = 30.0 
let widthheight = width - height 

class YourClass { ... 
+1

Ich denke, Sie mischen verschiedene Konzepte zusammen, die das Problem des OP nicht lösen. –

+0

Es empfiehlt sich, statische (Klassen-) Variablen und -Kontras in mehreren Sprachen zu verwenden. Und es löst das Problem des OP, ohne irgendwelche Methoden zu überschreiben. – Adam

+1

Wenn das OP versucht, Felder/Eigenschaften eines Objekts zu modellieren: Statische/Klassenfelder sind nicht geeignet, und auch keine globalen Variablen. –

1

Dies ist ein Kandidat für eine berechnete Eigenschaft als solche:

class Foo { 
    let width = 200.0 
    let height = 30.0 
    var widthheight : Double { return width - height } 
} 

Sie könnten ein Problem von ‚erhöhen, aber es wird berechnet jedes Mal'; vielleicht hängt Ihre Anwendung von einer einzigen Subtraktion ab, die wiederholt durchgeführt wird - aber nicht wahrscheinlich. Wenn die Subtraktion ein Problem ist, stellen Sie widthheight in init()