2017-06-28 53 views
12

sentezlenmesi dekoder init önler Ben Diyar en nesne türü devralan aşağıdaki Swift 4 Codable sınıfı:çözülebilir - miras

final class SearchResult: RealmSwift.Object, Codable { 
    @objc dynamic var name: String = "" 
    @objc dynamic var region: String = "" 

    enum CodingKeys: String, CodingKey { 
     case name = "name" 
     case region = "region" 
    } 
} 

burada beklenti I yok, böylece init(from decoder: Decoder) yöntem sentezlenmiş olur olduğunu Kendimi uygulamak için, büyük bir kolaylık.

super.init isn't called on all paths before returning from initializer

derleyici hatası kurtulmak git için üç yolu vardır, ancak bunların hiçbiri iyi:

  1. boş init(from decoder: Decoder) uygulamak Ancak bu uygulamaya değil aşağıdaki derleyici hata verir yöntemi, sadece super.init() çağırır. Bu, sentezlenmeyi engelliyor gibi görünüyor, hiçbir şey aslında çözülmediği anlamına geliyor, çünkü bu sadece boş bir yöntem.

  2. Tüm init(from decoder: Decoder) yöntemini elle uygulayın. Bu çalışır, ancak şimdi Codable kullanma zevkini çoktan gitti.

  3. Tüm bölge ile ilgili kodları kaldırın. Şimdi Codable beklendiği gibi çalışıyor, ama şimdi, artık Realm'yi kullanamıyorum. o init(from decoder: Decoder) adil değil elle, uygulanmakta olan aslında olduğunu algılamalıdır çünkü

Bu, benim için Swift böcek gibi görünüyor.

Bilmediğim herhangi bir öneri veya geçici çözüm var mı?

+3

https://bugs.swift.org/browse/SR-5122 adresinde bu sorunu izleyen bir Hızlı hata var. Ayrıca, Apple'ın geçici çözümlerin neden olduğu acıyı bilmesi için bir Radar'ı göndermenizi ve bir düzeltmeye önem vermenizi öneririm. Yine de, bu sorun için geçici çözümler konusunda emin değilim. – bdash

+5

Evet, bu bir hatadır. Sınıflardaki katlanılabilir uyumluluk şu anda birkaç yerde bozuk ve yakında düzeltmek istiyorum. (Bu, özelliğin önemli bir parçasıdır ve yayınlanmadan önce düzeltilmelidir.) –

+0

Bunu duymak güzel. O zamana kadar elle uygulamaya devam edeceğimi düşünüyorum. – RamwiseMatt

cevap

0

Bu, Xcode 9 GM'de çözülmüştür, bu da şimdi başlatıcıların required init() yöntemiyle sınıflardan miras alınırken Katlanılabilir tarafından sentezlenmesine izin vermektedir.