web-dev-qa-db-fra.com

Comment puis-je créer une classe statique dans Swift?

Je cherche à créer une classe statique appelée VectorCalculator. Peut-être que cette fonction devrait juste être placée dans ma classe Vector (similaire à la méthode NSString - -stringByAppendingString Dans Obj-C) ... et si vous pensez que ... faites le moi savoir.

Quoi qu'il en soit, je veux ajouter quelques fonctions statiques à une classe statique appelée VectorCalculator. Il calculera le "produit scalaire" et renverra un vecteur. Une autre fonction sera probablement de "calculer et renvoyer l'angle entre deux vecteurs donnés".

A) Quelqu'un irait-il dans cette voie pour créer une classe statique pour ceci ou

B) dois-je simplement ajouter ces fonctions en tant que fonctions d'instance de la classe Vector telles que ... public func dotProductWithVector(v: Vector) -> Vector et public func angleWithVector(v: Vector) -> Double. Et puis ces deux vecteurs d'argument v seront appliqués au vecteur principal des classes Vector .

Quel est l'avantage de choisir A ou B?

Si vous pensez que B, juste pour référence future, comment créeriez-vous une classe entièrement statique dans Swift?

12
chris P

Si je vous ai bien compris, vous êtes intéressé par les méthodes de type dans le cas A. Vous indiquez méthodes de type en écrivant le mot clé statique avant le mot clé func de la méthode. Les classes peuvent également utiliser le mot clé class pour permettre aux sous-classes de remplacer l'implémentation de cette méthode par la superclasse. (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)

Quant aux avantages de B, cela dépend des tâches que vous résolvez. Si vous souhaitez laisser les vecteurs d'origine non modifiés, il est plus pratique d'utiliser une variante A. Mais je pense que vous pourriez fournir les deux types de fonctionnalités.

10
curious

comment créeriez-vous une classe entièrement statique dans Swift?

static signifie pas d'instance, donc j'en ferais une structure sans initialiseur:

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

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

Je pense que ce que vous recherchez sont des fonctions de classe? Peut-être que votre réponse se trouve ici. Comment déclarer une fonction de niveau classe dans Swift?

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

Foo.Bar()

Dans Swift 2.0 vous pouvez utiliser le mot-clé statique au lieu de la classe. Mais vous devez utiliser le mot-clé statique pour les structures et le mot-clé de classe pour les classes

// Edit vient de voir que j'ai mal compris votre question

3
Sprotte