2016-01-25 7 views
6

私は、VectorCalculatorという静的クラスを作成しようとしています。おそらく、この関数はVectorクラス(Obj-CのNSStringの-メソッドに似ています)に置かれていなければなりません。Swiftで静的クラスを作成するにはどうすればよいですか?

とにかく、私はVectorCalculatorという静的クラスにいくつかの静的関数を追加したいと思います。 'ドットプロダクト'を計算してベクトルを返します。別の関数は、 '与えられた2つのベクトルの間の角度を計算して返します'ということになります。

A)誰もがこのまたは

Bのための静的クラスを作成し、このルートを行くだろう)私はちょうどそのような... public func dotProductWithVector(v: Vector) -> Vectorpublic func angleWithVector(v: Vector) -> DoubleとしてVectorクラスのインスタンス機能として、これらの機能を追加する必要があります。そして、これらの引数ベクトルの両方vはVectorクラスのメインベクトルuに適用されます。

AまたはBのいずれの利点がありますか?

今後の参考のため、Bと考えるとは、Swiftのすべての静的クラスをで作成する方法はありますか?

+1

これはあなたを助けることができる http://en.swifter.tips/static-class/ –

+2

は何ですか'静的クラス'? –

+0

私はあなたのアプローチと非常に混同しています。なぜ静的なクラスが必要ですか? –

答えて

6

を誤解私が正しくあなたを理解してきた場合は、ケースAのタイプの方法に興味があることを見ますメソッドのfuncキーワードの前にstaticキーワードを記述して、type methodsと指定します。クラスは、サブクラスがそのメソッドのスーパークラスの実装をオーバーライドできるように、classキーワードを使用することもできます。 (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) 

これは、あなたが解決するタスクによって異なります。元のベクトルを変更しないままにしたい場合は、Aバリアントを使用する方が便利です。しかし、私は両方のタイプの機能を提供できると思います。

+0

ありがとう!この素早い構文の説明ができますか? '(_:Vector、)? –

+0

@chrisP実際、この宣言は正しくなかったので、私は自分の答えを編集しました。メソッドの本体で渡されたパラメータを使用できるようにするには、パラメータはローカルパラメータ名を持つ必要があります。 'funcメソッド(localNameFirst:Vector、localNameSecond:Vector){}'外部パラメータもあります。これらは、コードの可読性を高めるラベルのようなものです。私の答えでは、このラベル(外部パラメータ)は_withVector_です。 「メソッドのローカルおよび外部パラメータ名」の節の[here](http://example.com)について説明します。 – curious

+0

@curiousこれは間違っていますか?パラメータの名前が1つだけの場合は、内部および外部の名前として機能し、最初の引数を関数の必須パラメータにします。 'static func dotProductOfVector(_ vec1:Vector、withVector vec2:Vector) - > Vector'のように、関数ヘッダに引数を宣言する必要があります。多分スウィフトはそれについて変わったのだろうか?私はまだ学んでいますが、これは物事を試すときに正しい方法であるようです。 – modiX

1

私はあなたが探しているのはクラス機能だと思いますか? あなたの答えはここで見つけることができるかもしれません。 How do I declare a class level function in Swift?

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

Foo.Bar() 

スイフト2.0には、クラスの代わりにstaticキーワードを使用することができます。しかし、あなたは、構造体やクラス

のクラスキーワードの静的なキーワードを使用する必要があります

//編集はちょうど私が正しくあなたの質問

5

方法あなたはスウィフト内のすべての静的クラスを作成しますか?

staticても何のインスタンスを意味していないので、私はそれがない初期化子を持つ構造体になるだろう:

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

    static func dotProduct(v: Vector, w: Vector) -> Vector { 
     ... 
    } 
} 
関連する問題