web-dev-qa-db-ja.com

Swiftで静的クラスを作成するにはどうすればよいですか?

VectorCalculatorと呼ばれる静的クラスを作成しようとしています。おそらく、この関数はVectorクラスに配置する必要があります(Obj-CのNSStringの-_-stringByAppendingString_メソッドに似ています)。

とにかく、VectorCalculatorという静的クラスにいくつかの静的関数を追加します。 「ドット積」を計算し、ベクターを返します。もう1つの機能は、「2つの与えられたベクトル間の角度を計算して返す」ことです。

A)このための静的クラスを作成するこのルートに誰か行くか

B)これらの関数を... public func dotProductWithVector(v: Vector) -> Vectorpublic func angleWithVector(v: Vector) -> DoubleなどのVectorクラスのインスタンス関数として追加する必要があります。そして、これらの引数ベクトルvの両方が、VectorクラスのメインVector に適用されます。

AまたはBに行く利点は何ですか?

Bと思うなら、将来の参考のために、Swiftですべての静的クラスをどのように作成しますか?

12
chris P

私があなたを正しく理解していれば、ケースAのTypeメソッドに興味があります。メソッドのfuncキーワードの前に静的キーワードを書くことで 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)

Bの利点については、解決するタスクに依存します。元のベクトルを変更せずに残したい場合は、Aバリアントを使用する方が便利です。しかし、両方のタイプの機能を提供できると思います。

10
curious

どのように作成しますか Swiftのすべての静的クラス?

staticはインスタンスがないことを意味するため、初期化子のない構造体にします。

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

    static func dotProduct(v: Vector, w: Vector) -> Vector {
        ...
    }
}
11
Cœur

あなたが探しているのはクラス関数だと思いますか?たぶんあなたの答えはここにあります。 Swiftでクラスレベルの関数を宣言する方法

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

Foo.Bar()

Swift 2.0では、classの代わりにstaticキーワードを使用できます。ただし、structにはstaticキーワードを、classにはclassキーワードを使用する必要があります

//編集は、あなたの質問を適切に誤解したことを確認しました

3
Sprotte