2016-08-25 59 views
9

Swift 3.0 (What is the 'open' keyword in Swift?) 'da open anahtar kelimesinin tanıtımıyla.Swift 'açık' anahtar sözcüğü ve geçersiz kılma yöntemi/uzantısı uzantısı?

Not: NSObject türetilmiş sınıflarda veya @objc öznitelikli yöntem/özelliklerdeki uzantılarla sınırlıdır.

Kod wich public modülünü tanımlama dışında artık araçlar 'geçersiz kılınabilir' olduğu gibi çerçeveler, kırdı/beyan ve modüllerin boyunca uzantı içinde public (class) yöntemleri/özellikleri kullandı.

Örnek:

public extension UIManagedDocument { 

    public class func primaryDocumentName() -> String { 
     return "Document" 
    } 

    public class func primaryStoreURL() -> URL { 
     let documentsURL = FileManager.default.userDocumentsURL 
     return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL) 
    } 

    public class func primaryModelName() -> String? { 
     return "Model" 
    } 

} 
  • Orijinal teklif (SE-0117) subclassing odaklanmıştır ve uzantıları söz etmez.
  • Şu uzantıları open anahtar kelime (sen open extension NSObject yazma yanı open func Method() olarak edemez)

Soru desteklemez: mümkün kılma uzantısı sağlanan yöntemler/özellikler olacaksa Geçici çözüm mı genelinde modüller/çerçeveler ?

+0

bu gerçekten kamu erişim modları vs yeni açık ile ilişkili mi? Hatalı olmadıkça, uzantılarda bildirilen yöntemleri yine de, Swift 2'de veya Swift 3'te geçersiz kılabilirsiniz. –

+0

* Saf * hızlı sınıflar için haklısınız, ancak NSObject türetilmiş sınıfların yanı sıra '@ objc 'öznitelikli yöntemleri/özellikleri de olabilir. ([Swift'deki uzantılar arasında geçersiz kılınabilir misiniz, değil mi?] (Http://stackoverflow.com/questions/27109006/can-you-override-between-extensions-in-swift-or-not-compiler-seems-confused# 27109202)) – Nocross

+0

Anlıyorum, teşekkürler. (Belki de bu bilgiyi soruya ekleyebilirsiniz). –

cevap

3
  • 'Protokol odaklı' - özelliklerini daha sonra protokol uyum için uzantıyı planı ayrı/istenen yöntemlerle protokolünü ilan ediyoruz.
  • 'Geleneksel' - istenen yöntem/özelliklerle ara (soyut) alt sınıfı uygulayın.

Protokol örnek: ben yanılıyorum sürece sadece uzatma bildiriminde public anahtar kelime atlarsanız

protocol PrimaryDocument { 
    static func primaryDocumentName() -> String 

    static func primaryStoreURL() -> URL 

    static func primaryModelName() -> String? 
} 

extension UIManagedDocument : PrimaryDocument { 

    open class func primaryDocumentName() -> String { 
     return "Document" 
    } 

    open class func primaryStoreURL() -> URL { 
     let documentsURL = FileManager.default.userDocumentsURL 
     return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL) 
    } 

    open class func primaryModelName() -> String? { 
     return "Model" 
    } 

} 
6

, sen sizin çerçevesinde open olarak uzatma yöntemleri ilan edebilir:

extension UIManagedDocument { 

    open class func primaryDocumentName() -> String { 
     return "Document" 
    } 
    // ... 
} 

Ve sonra (NSObject alt sınıfları için veya @objc üye) ana uygulama (ya da herhangi bir modülde) 'de özel alt sınıfta yöntemi geçersiz kılabilirsiniz:

class MyManagedDocument: UIManagedDocument { 

    override class func primaryDocumentName() -> String { 
     return "MyDocument" 
    } 
    // ... 
} 
+0

Uzantı başka bir modülde (paylaşılan çerçeve) bildirildiği ve bağımlı hedefte somut alt sınıf uygulandığı için "public" sözcüğünü atlayamıyorum (Uygulama/uzama). – Nocross

+0

@Nocross: Aslında bunu test ettim ve benim için çalıştı. "UIManagedDocument uzantısı", ana uygulamada bir framework ve "sınıf MyManagedDocument: UIManagedDocument {}" içeriyor. –

+0

Doğru çalışıyor. Ancak, beni rahatsız eden şey, bu şekilde, en azından kararsız olan, aynı zamanda farklı IDE'lere özgü bir uygulama olabilen, hızlı 'çıkarım' mantığına dayandığımızdır. – Nocross