2015-11-24 23 views
5

Swift projemde statik izin dizeleriyle dolu bir Sabitler dosyası oluşturmak istiyorum.Swift Constants dosya sınıfı veya yapısı?

Yapı veya sınıf olarak oluşturmalı mıyım? Ve neden?

struct staticStrings { 

    static let name = "String1" 
    static let age = "age1" 

} 

Ve verilere erişmek için global sadece staticStrings.name çağırır: Statik veriler için yapılar kullanabilir

cevap

5

. Eğer tamamen static kullanıyorsan hiç fark yok.

Değerler Değer Türleri ise, static if let someTypeProperty iyi olacaktır. Referans türleri ise, bazı ekstra dikkat gereklidir. özelliklere sahip


Sadece bazı şeyler: beklendiği gibi

struct PresetStringsStruct { 

    static let someString : String = "Some Text" // struct 
    static let someView : UIView = UIView(frame: CGRectZero) 

    private init() { 
     print("init") // never happens 
    } 
} 

class PresetStringsClass { 

    static let someString : String = "Some Text" // struct 
    static let someView : UIView = UIView(frame: CGRectZero) 

    private init() { 
     print("init") // never happens 
    } 
} 

struct özellikleri çalışır. mülkiyet statik özellikler bir örneğine başvurular dönecektir bir reference type olduğunu


// value properties 
var txtStruct = PresetStringsStruct.someString // "Some Text" 
txtStruct = "SomeOtherText" // "SomeOtherText" 
var txtStruct2 = PresetStringsStruct.someString // "Some Text" 

var txtClass = PresetStringsClass.someString // "Some Text" 
txtClass = "SomeOtherText" // "SomeOtherText" 
var txtClass2 = PresetStringsClass.someString // "Some Text" 
.

// reference properties 
var viewStruct = PresetStringsStruct.someView 
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 50, height: 50) 

var viewClass = PresetStringsClass.someView 
viewClass.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 
var viewClass2 = PresetStringsClass.someView // CGRect(x: 0, y: 0, width: 50, height: 50) 

Ben static işlevlerini kullanmayı biliyorum sadece aptal kanıt yöntemi.subclassclass ve override işlevlerini görebilmek için class işlevlerini kullanabilirsiniz. Bir static let someProperty : Int = 0

struct PresetStringsStruct { 

    static func someStringFunc() -> String { 
     return "SomeText" 
    } 

    static func someViewFunc() -> UIView { 
     return UIView(frame: CGRectZero) 
    } 
} 

class PresetStringsClass { 

    static func someStringFunc() -> String { 
     return "SomeText" 
    } 

    static func someViewFunc() -> UIView { 
     return UIView(frame: CGRectZero) 
    } 
} 

kurtulmak için bir yolu yoktur Bu aynı zamanda bellekte kalan den çok fazla Tip Özellikler 'önler

(static geçersiz kılma izin ve aslında class final için bir takma ad değildir)

Daha mantıklı olana karar vermek size kalmış. Kapatma struct veya class asla kullanılmadığından, hiçbir fark yaratmaz.Benim için struct daha mantıklı geliyor çünkü classes ile çok fazla davranış ilişkilendiriyorum.


Ayrıca kendinize fazla iş verebilir ve bunun yerine özelliklerinin işlevlerini kullanarak kaynaklanan () kurtulmak.

struct PresetStringsStruct { 

    static var someString : String { 
     get { 
      return someStringFunc() 
     } 
    } 

    static var someView : UIView { 
     get { 
      return someViewFunc() 
     } 
    } 

    static func someStringFunc() -> String { 
     return "SomeText" 
    } 

    static func someViewFunc() -> UIView { 
     return UIView(frame: CGRectZero) 
    } 
} 

var viewStruct = PresetStringsStruct.someView 
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 0, height: 0) 
1

en iyi seçimdir.

Neden sınıfın daha yapılar ve onun daha iyi kullanın: kopyalama sınıfları ile olur aynı örneğine birden referansı olan çok daha güvenlidir, çünkü onlar nispeten küçük ve kopyalanabilir ise Yapılar tercih edilir. Daha fazla ayrıntı için

: Bir alt sınıf ve açıkçası overrideclass yöntemleri oluşturabileceğiniz bir sınıf ile structs and classes

+0

Bir sınıf veya yapı yalnızca statik özelliklere/yöntemlere sahip olduğunda ve hiçbir zaman başlatılamayacaksa, türün kendisinin bir Referans veya Değer türü olması önemli değildir. Sadece davranışlarının özelliklerinin davranışlarını nasıl etkilediğini belirtir. –

+0

Peki bu doğru @RMenke. –