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
}
}
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
Evet, özel bir destek alanı çalışır, ancak yalnızca farklı bir dosyadaysa. Kesinlikle bir böcek var. – MH175
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