Swift'teki yapılar için memberwise başlatıcıyı varsayılan olarak nasıl herkese açık hale getirebilirim?


165

Bir yapı tanımlayan hızlı bir çerçeve var:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

Ancak, kitaplığı ithal başka bir projeden örtük üye bilge başlatıcısı kullanamıyorum. Hata 'CollectionTO' başlatılamaz çünkü erişilebilir bir başlatıcısı yok. yani, varsayılan örtük üyeye akıllı anahtar sözcüğü başlatılmaz.

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

Böyle kendi init yöntemini eklemek zorunda:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}

... ama kimsenin bildiği başka bir yol var mı?

Yanıtlar:


271

Kılavuzdan alıntı:

"Yapı Türleri için Varsayılan Üyelik Başlatıcıları Yapının depolanan özelliklerinden herhangi biri özelse, yapı türü için varsayılan üye başlatıcısı özel kabul edilir. Aksi takdirde, başlatıcı iç erişim düzeyine sahiptir.

Yukarıdaki varsayılan başlatıcıda olduğu gibi, bir genel yapı türünün başka bir modülde kullanıldığında üye yönlü bir başlatıcı ile başlatılmasını istiyorsanız, tür tanımının bir parçası olarak kendiniz herkese açık bir üye başlatıcı sağlamanız gerekir. "

"Hızlı Programlama Dili" bölümü, "Erişim Kontrolü" bölümünden alıntı .


289
Bu sinir bozucu. :(
Dan Loewenherz

7
[ github.com/apple/swift-evolution/blob/master/proposals/… diyor ki: “Alıntı Chris Lattner: Swift'in varsayılan üye başlangıç ​​durumuna getirme davranışı en azından şu eksikliklere sahip (IMO): 2) Erişim kontrolü + üyelik başlangıç kendiniz uygulamanızı gerektirir ”. Belki de bu sadece bir sebepten ötürü var olan bir eksikliktir. Bununla ilgili daha fazla referans bulunamadı.
Jano

8
@DanLoewenherz Evet, bu rahatsız edici. Gerekçe şudur: “Genel bir tür varsayılan olarak genel üyelere değil dahili üyelere sahiptir. Bir tür üyenin herkese açık olmasını istiyorsanız, üyeyi açıkça bu şekilde işaretlemeniz gerekir. Bu gereksinim, bir türün herkese açık API'sının yayınlamayı seçtiğiniz bir şey olmasını sağlar ve bir türün dahili çalışmalarını yanlışlıkla genel API olarak sunmaktan kaçınır. ” Alıntı: Apple Inc. “Hızlı Programlama Dili.” iBooks. itun.es/gb/jEUH0.l
bandejapaisa

18
Bir derleyici yönergesi, varsayılan davranışı geçersiz kılmak ve genel hale getirmek için iyi olur.
bandejapaisa

9
Dahili, imo için korkunç bir seçimdir. Temel olarak, bir modüle ilk defa harici olarak başvururken beklenmedik sorunlarla karşılaşacağınızı garanti eder. Neden her şeyi gizli olarak ayarlamıyorsunuz, böylece bir şeye doğru erişim düzeyi verilmediğinde hemen söyleyebilir ve sonra genel veya dahili olması gerekip gerekmediğine karar verebiliriz?
devios1

72

En azından varsayılan üye başlangıç ​​ayarlayıcısına sahip olmak mümkün olmasa da, aşağıdaki adımlarla hızlıca bir tane yapabilirsiniz:

  1. Nesneyi yapı yerine geçici olarak sınıf yapma
  2. Kayıt etmek
  3. Sınıf adına sağ tıklayın ve refactor'u seçin -> Üyelik Başlatıcısı Oluştur
  4. Bir yapıya geri döndür

parlak. Bu hızlı eksiklik etrafında çalışmak için yeterince teşekkür edemem
Anton Tropashko

1
Çalışır ve ayrıca yapılar yerine sınıfları kullanmak için motive eder youtube.com/watch?v=_V2sBURgUBI
Isaac Carol Weisberg

Bu süper bir ipucu !!
Peymankh

6
Xcode 11'den itibaren, Üyelikler için Generate Memberitial Initializer'ı da kullanabilirsiniz!
Brock Batsell

Fantastik!!! Bu doğru cevap değil, ama çok iyi bir ipucu! Bana çok yardım etti!
GuiOS


1

Artık tam bir hızlı veri modeli dosyasını, satır satır ayrıştırmak ve genel erişim değiştiricileri, genel üye olarak varsayılan başlatıcıları ve diğer şeyleri otomatik olarak oluşturulan ayrı bir çıkış hızlı dosyasına eklemek için bir yakut mücevher 💎 var.

Bu mücevher swift_republic olarak adlandırılır

Bu gem'i çalıştırmak için lütfen aşağıdaki belgelere bakın:

https://github.com/mehul90/swift_republic


1
Müthiş bir çözüm !! Zaten bir paketleyici oluşturdum swift_republicve iyi çalıştım .
Md Shahed Hossain
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.