2016-01-25 15 views
6

VectorCalculator adında bir statik sınıf oluşturmak istiyorum. Belki de bu fonksiyon sadece Vector sınıfına yerleştirilmelidir (NSString'inkine benzer - Obj-C'de -stringByAppendingString yöntemi) ... ve eğer bunu düşünüyorsanız ... bana haber ver.Swift'de statik bir sınıfı nasıl oluşturabilirim?

Yine de VectorCalculator adlı statik bir sınıfa bir çift statik işlev eklemek istiyorum. 'Nokta ürününü' hesaplar ve bir Vector döndürür. Başka bir fonksiyon muhtemelen 'verilen iki vektör arasındaki açıyı hesaplamak ve döndürmek' olacaktır.

A) Herkes ben böyle public func dotProductWithVector(v: Vector) -> Vector ve public func angleWithVector(v: Vector) -> Double ... olarak Vektör sınıfının örneği fonksiyonları olarak bu işlevleri eklemek gerekir) bu ya

B için statik bir sınıf oluşturulmasının bu yolu gider. Ve sonra bu argüman vektörlerinin her ikisi de v Vektör Vektörleri ana Vector u'a uygulanacaktır.

Ya A veya B'ye gitmenin yararı nedir?

B'yi düşünürseniz, sadece ileride başvurmak için, ,'u Swift'deki tüm statik bir sınıfı nasıl oluşturursunuz?

+1

bu Ne http://en.swifter.tips/static-class/ –

+2

olan yardımcı olabilir Statik sınıf? –

+0

Yaklaşımınızla çok karıştım. Neden burada statik derslere ihtiyacın var? –

cevap

6

yanlış seni doğru anlamış ettiyseniz vaka A'da Tipi yöntemlerinde ilgilenen gördü Sen yöntemin func anahtar sözcüğünden önce statik anahtar kelimeyi yazarak type methods belirtin. Sınıflar, alt sınıfların üst sınıfın bu yönteme uygulanmasını geçersiz kılmasına izin vermek için sınıf anahtar kelimesini de kullanabilir. (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'nin faydaları için, çözdüğünüz görevlere bağlıdır. Orijinal vektörleri modifiye edilmeden değiştirmek isterseniz, bir varyantı kullanmak daha uygundur. Ama bence her iki işlevsellik de sağlanabilir.

+0

Teşekkürler! Bu hızlı sözdizimini biraz açıklayabilir misin? '(_: Vector,)'? –

+0

@chrisP Elbette. Aslında bu beyan doğru değildi, bu yüzden cevabımı düzenledim. Geçirilen parametrenin yöntem gövdesinde kullanılabilmesi için, parametrenin yerel parametre adına sahip olması gerekir. func yöntemi (localNameFirst: Vector, localNameSecond: Vector) {} '. Dış parametreler de vardır. Kodunuzun okunabilirliğini artıran etiketler gibidir. Cevabımda bu etiket (harici parametre) _withVector_. "Yöntemler için Yerel ve Harici Parametre Adları" bölümünde [burada] (http://example.com) açıklanmıştır. – curious

+0

@curious Bu yanlış mı, yoksa Swift mi değişti? Bir parametrenin sadece bir isminiz varsa, iç ve dış ad olarak işlev görür, ilk bağımsız değişkeninizi işlevin gerekli adlandırılmış bir parametresi haline getirir: 'VectorCalculator.dotProductOfVector (vec1: vec1, withVector: vec2) 'İlk parametreye izin vermez isimlendirilecek şekilde, işlev üstbilgisindeki argümanı şu şekilde bildirmelisiniz: 'statik func dotProductOfVector (_ vec1: Vector, withVector vec2: Vector) -> Vector'. Belki Swift bu konuda değişti? Hala öğreniyorum, ama işleri denerken bu doğru yol gibi görünüyor. – modiX

1

Bence aradığınız şey sınıf fonksiyonları mı? Belki Cevabınız burada bulunabilir. How do I declare a class level function in Swift?

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

Foo.Bar() 

Swift 2.0 sınıfın yerine statik anahtar kelime kullanabilirsiniz. Ama yapılar ve sınıflar

için sınıf anahtar kelime için statik anahtar kelime kullanmanız gerekir

// Edit sadece ben düzgün soru

5

nasıl Swift tüm statik bir sınıfı oluşturursunuz?

static

hiçbir hallerinden biridir, bu yüzden hiçbir ilklendiricili bunu bir yapı yapacak:

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

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