2016-01-25 11 views
6

Ich möchte eine statische Klasse namens VectorCalculator erstellen. Vielleicht sollte diese Funktion nur in meiner Vector-Klasse platziert werden (ähnlich wie NSString - -stringByAppendingString Methode in Obj-C) ... und wenn Sie denken, dass ... lassen Sie es mich wissen.Wie kann ich eine statische Klasse in Swift erstellen?

Wie auch immer Ich möchte ein paar statische Funktionen zu einer statischen Klasse namens VectorCalculator hinzufügen. Es berechnet das "Punktprodukt" und gibt einen Vektor zurück. Eine andere Funktion wird wahrscheinlich sein, den Winkel zwischen zwei gegebenen Vektoren zu berechnen und zurückzugeben.

A) Würde jemand gehen diesen Weg einer statischen Klasse für diese zu schaffen oder

B) sollte ich diese Funktionen wie zB Funktionen der Vector-Klasse fügen Sie einfach wie ... public func dotProductWithVector(v: Vector) -> Vector und public func angleWithVector(v: Vector) -> Double. Und dann werden diese beiden Argumentvektoren v auf die Vektorklassen Hauptvektor u angewendet.

Was ist der Vorteil von A oder B?

Wenn Sie denken B, nur für die zukünftige Referenz, wie würden Sie eine statische Klasse in Swift erstellen?

+1

das Sie http://en.swifter.tips/static-class/ –

+2

helfen könnte Was ist 'statische Klasse'? –

+0

Ich bin sehr verwirrt mit Ihrem Ansatz. Warum brauchst du hier statische Klassen? –

Antwort

6
mißverstanden

Wenn ich Sie richtig verstanden habe, sind Sie in Art Methoden bei A. interessiert Sie Geben Sie type methods an, indem Sie das Schlüsselwort static vor das func-Schlüsselwort der Methode schreiben. Klassen können auch das Schlüsselwort class verwenden, damit Unterklassen die Implementierung dieser Methode durch die Oberklasse überschreiben können. (c)

struct Vector { 
     var x, y, z: Int 
    } 

    class VectorCalculator { 
     static func dotProductOfVector(vec1: Vector, withVector vec2: Vector) -> Vector { 
      let newX = //calc x coord; 
      let newY = //calc y coord;; 
      let newZ = ////calc z coord;; 
      return Vector(x: newX,y: newY, z: newZ); 
     } 
    } 

let vec1 = Vector(x:1, y:2, z:3) 
let vec2 = Vector(x:4, y:5, z:6) 
let v = VectorCalculator.dotProductOfVector(vec1, withVector: vec2) 

Wie für die Vorteile von B hängt es von Aufgaben, die Sie lösen. Wenn Sie die ursprünglichen Vektoren unverändert lassen möchten, ist es bequemer, eine Variante zu verwenden. Aber ich denke, dass Sie beide Arten von Funktionalität bereitstellen können.

+0

danke! Kannst du mir diese kurze Syntax erklären ... '(_: Vector,)'? –

+0

@chrisP Sicher. Eigentlich war diese Erklärung nicht korrekt, deshalb habe ich meine Antwort bearbeitet. Um den übergebenen Parameter im Body der Methode verwenden zu können, sollte der Parameter einen lokalen Parameternamen aufweisen, z. 'func-Methode (localNameFirst: Vector, localNameSecond: Vector) {}'. Es gibt auch externe Parameter. Sie sind genau wie Beschriftungen, die die Lesbarkeit Ihres Codes erhöhen. In meiner Antwort ist diese Bezeichnung (externer Parameter) _withVector_. Es wird [hier] (http://example.com) im Abschnitt "Lokale und externe Parameternamen für Methoden" erklärt. – curious

+0

@curious Das habe ich falsch oder Swift darüber verändert? Wenn Sie nur einen Namen eines Parameters haben, fungiert er als interner und externer Name und macht Ihr erstes Argument zu einem benannten Parameter der Funktion: 'VectorCalculator.dotProductOfVector (vec1: vec1, withVector: vec2)' Um den ersten Parameter nicht zuzulassen Um benannt zu werden, müssen Sie das Argument im Funktionskopf wie folgt deklarieren: 'static func dotProductOfVector (_ vec1: Vektor, mitVector vec2: Vector) -> Vector'. Vielleicht hat Swift sich deswegen verändert? Ich lerne immer noch, aber das scheint der richtige Weg zu sein, Dinge auszuprobieren. – modiX

1

Ich denke, was Sie suchen, sind Klassenfunktionen? Vielleicht kann Ihre Antwort hier gefunden werden. How do I declare a class level function in Swift?

class Foo { 
    class func Bar() -> String { 
     return "Bar" 
    } 
} 

Foo.Bar() 

In Swift 2.0 können Sie das Schlüsselwort static statt Klasse. Aber Sie sollten

für Klassen statische Schlüsselwort für structs und Klasse Schlüsselwort

// bearbeiten gerade gesehen, dass ich richtig Ihre Frage

5

Wie würden Sie eine statische Klasse in Swift erstellen?

static bedeutet keine Instanz, also würde ich es eine Struktur ohne initializer machen:

struct VectorCalculator { 
    @available(*, unavailable) private init() {} 

    static func dotProduct(v: Vector, w: Vector) -> Vector { 
     ... 
    } 
}