2016-01-25 13 views
6

Sto cercando di creare una classe statica denominata VectorCalculator. Forse questa funzione dovrebbe essere inserita nella mia classe Vector (simile al metodo NSString - -stringByAppendingString in Obj-C) ... e se pensi che ... fammi sapere.Come posso creare una classe statica in Swift?

In ogni caso, desidero aggiungere un paio di funzioni statiche a una classe statica denominata VectorCalculator. Calcolerà il 'prodotto punto' e restituirà un vettore. Un'altra funzione sarà probabilmente 'calcolare e restituire l'angolo tra due vettori dati'.

A) qualcuno dovrebbe seguire questa strada della creazione di una classe statica per questo o

B) devo solo aggiungere queste funzioni come funzioni di istanza della classe vettoriale, come ... public func dotProductWithVector(v: Vector) -> Vector e public func angleWithVector(v: Vector) -> Double. E quindi entrambi questi vettori argomento v verranno applicati al vettore principale delle classi Vector u.

Qual è il vantaggio di utilizzare A o B?

Se pensi che B, solo per riferimento futuro, come creeresti una classe statica in Swift?

+1

questo potrebbe aiutare a http://en.swifter.tips/static-class/ –

+2

Che cosa è 'classe statica'? –

+0

Sono molto confuso con il tuo approccio. Perché hai bisogno di classi statiche qui. –

risposta

6

Se ti ho capito bene sei interessato a metodi di tipo in caso A. indicare type methods scrivendo la parola chiave static prima della parola chiave func del metodo. Le classi possono anche usare la parola chiave class per consentire alle sottoclassi di sovrascrivere l'implementazione della superclasse di quel metodo. (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) 

Per quanto riguarda i vantaggi di B, dipende dalle attività risolte. Se vuoi lasciare i vettori originali non modificati è più comodo usare una variante. Ma penso che potresti fornire entrambi i tipi di funzionalità.

+0

grazie! Puoi spiegare questo bit di sintassi rapida ... '(_: Vector,)'? –

+0

@chrisP Sure. In realtà questa dichiarazione non era corretta, quindi ho modificato la mia risposta. Per poter utilizzare il parametro passato nel corpo del metodo, il parametro deve avere il nome del parametro locale, ad es. 'metodo func (localNameFirst: Vector, localNameSecond: Vector) {}'. Ci sono anche parametri esterni. Sono proprio come le etichette che aumentano la leggibilità del tuo codice. Nella mia risposta questa etichetta (parametro esterno) è _withVector_. Viene spiegato [qui] (http://example.com) nella sezione "Nomi dei parametri locali ed esterni per i metodi". – curious

+0

@curious Questo ho sbagliato o Swift è cambiato a riguardo? Se hai un solo nome di un parametro, agisce come nome interno ed esterno, rendendo il tuo primo argomento un parametro chiamato della funzione: 'VectorCalculator.dotProductOfVector (vec1: vec1, withVector: vec2)' Per consentire il primo parametro non per essere nominato, devi dichiarare l'argomento nell'intestazione della funzione in questo modo: 'static func dotProductOfVector (_ vec1: Vector, withVector vec2: Vector) -> Vector'. Forse Swift è cambiato a riguardo? Sto ancora imparando, ma questo sembra essere il modo corretto quando si provano le cose. – modiX

1

Penso che quello che cerchi siano funzioni di classe? Forse la tua risposta può essere trovata qui. How do I declare a class level function in Swift?

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

Foo.Bar() 

In Swift 2.0 è possibile utilizzare la parola chiave static invece di classe. Ma si dovrebbe usare parola chiave statica per le strutture e la classe parola chiave per le classi

// Modifica appena visto che ho frainteso la tua domanda correttamente

5

come creereste una classe statica in Swift?

static significa nessun caso, quindi mi renderebbe una struttura senza inizializzatore:

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

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