2017-11-03 103 views
5

Swift'de, başlatıcıyı özel hale getirerek bir nesnenin doğrudan başlatılmasını önleyebilirsiniz. Bunu bir fabrika kalıbı ile yapmak isteyebilirsiniz.Yapılardaki hızlı uzantılar özel başlatma korumasını imkansız hale getirir

Ancak bir uzantı oluşturursanız, farklı bir başlatıcı sağlayabilir ve derler. Uzantının aynı dosyada olup olmadığı önemli değil. Örneğin, fabrika yönteminiz bazı veri doğrulaması yaparsa, bunun ciddi sonuçları olabilir.

Özel girişler hakkında bir şey özlüyor muyum? Bu çok kötü görünüyor. Bunu önleyebilir miyim? Yukarıdaki zneak yorumlarına gereğince

struct Foo { 

    let data: Int 

    // factory method 
    static func makeFoo(data: Int) -> Foo { 
     return Foo(data: data) 
    } 

    // private init with data validation 
    private init(data: Int) { 
     guard data < 100 else { 
      fatalError("Foo should only have values under 100") 
     } 
     self.data = data 
    } 
} 

extension Foo { 
    init(someData: Int) { 
     // This bypasses the data validation and puts Foo into an invalid state. 
     self.data = someData 
    } 
} 
+1

Hmm disallowed edilecektir. Bunun bir böcek olduğunu söyleyebilirim. Foo’yu bir sınıf haline getirerek ya da özel bir alan ekleyerek, etrafta gezinebilirsiniz. – Kevin

+0

Evet, özel bir destek alanı çalışır, ancak yalnızca farklı bir dosyadaysa. Kesinlikle bir böcek var. – MH175

+2

Sorununuzun yarısı bilinen bir esneklik hatasıdır. Apple'ın Ürdün Gül'ün [cross-module struct başlatıcılarının başka bir modül-içi struct başlatıcısı çağırmasını zorunlu kılmak] için bir önerisi var (https://github.com/jrose-apple/swift-evolution/blob/restrict-cross-module-struct- başlatıcılar/teklifler/nnnn-restrict-cross-module-struct-initializers.md), eğer başlatıcılar özel ise, imkansızdır. – zneak

cevap

İlgili konular