2014-08-29 21 views
21

Swift'de, modüllerinin ad alanı olarak çalışması nedeniyle artık prefix classes'a gerek yoktur.Önek uzantısı işlevleri

Uzantı önekleme işlevleri hakkında ne düşünüyorsunuz? Örneğin:

extension UIImage { 

    public func hnk_hasAlpha() -> Bool { ... } 

} 

Bir yandan Swift dinamik değildir, bu nedenle çarpışmalar derleyici hataları oluşturur.

Ancak derlenmiş kod, uzantı yöntemlerimden birinin eklendiği gelecekteki bir iOS/OS X sürümünde çalışıyorsa ne olur? Aynı imzaya sahip olsalar bile farklı modüllerdeki yöntemler farklı semboller olarak kabul edilir mi?

Genişletilmiş sınıf bir NSObject alt sınıfı mı yoksa saf Swift sınıfı mıdır? Objective-C tiplerinin

uzantıları getireceği bütün, Objective-C kategorileri olarak uygulanmaktadır: Burada bazı incelik var

+0

Neden Apple tarafından sağlanan bir sınıfa işlevsellik eklemenin iyi bir fikir olduğunu düşünüyorsunuz? Neden sadece bir işlev yazmıyoruz. Bu kod ile çalışan geleceğin geliştiricileri için açık olacaktır. Veya alt sınıf. – zaph

+12

İyi bir fikir olsun ya da olmasın, sorunun teknik yönünden alakasızsa, Swift bu tür çarpışmaları nasıl ele alır. Apple sınıflarını genişletmenin, sembolün kapsamını sınırlarken, daha iyi bir bağlam sağlamak ve diğer şeylerin yanı sıra sarmalayıcı nesnelere başvurmadan özel protokoller uygulamak için faydalı olduğunu düşünüyorum. – hpique

cevap

20

. Ancak, Swift türlerinin uzantıları, yalnızca içe aktarma nedeniyle görünür durumdayken geçerlidir. Bu, özel bir sistem yöntemini (şimdi veya gelecekte tanıtılmış olsun) yanlışlıkla silmeyeceğiniz anlamına gelir ve sistem sizinkiyle aynı ada sahip bir genel yöntem tanıtırsa, bir derleme zamanı hatası alırsınız. yeniden oluşturuyorsunuz, ancak mevcut uygulamanız kırılmayacak.

+0

Teşekkürler. Kaynağın var mı? – hpique

+2

Hatırlama, tbh. Dev forumların bazı kombinasyonları ve hızlı çalışan kişilerle konuşmak. –

+0

@hpique Bu belgeyi kontrol edin: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35 bölüm ' Uzantıları. Son durum ifadeleri 'Objective-C türündeki varolan yöntemleri veya özellikleri geçersiz kılmak için uzantıları kullanamazsınız.' Çakışan imzalar bulursa, derleyici bir hata döndürür. – lukewar