2015-07-09 21 views
17

Swift, herhangi sınıftaYapı için grup nasıl edinilir?

let bundle = NSBundle(forClass: self.dynamicType) 

arayıp geçerli paket alabilirsiniz. Örneğin, NSBundle.mainBundle(), bu, örneğin birim testlerini çalıştırırken doğru paketi almada başarısız olur.

Peki bir Swift struct şu anki paket alabilirim?

+0

Ayrıca bir cevap ararken Bu .. Şu anda bir yer tutucu sınıf tanımı ve bir NSBundle uzantısı var yardımcı olur, böylece uygun bir çözüm bulunana kadar çalışmaya devam edebilirim –

cevap

14

burada en iyi çözüm için bir paket gerekenler bağlıdır.

o kodu çalışır yazarken yüklenecek bilinen Belirli bir uygulama, çerçeve veya uzatma pakette sadece mevcut kaynakların bakmak mı? Bu durumda, belirli bir tür tanımlayan paketi dinamik olarak aramak yerine init(identifier:)'u kullanmak isteyebilirsiniz.

"Türünü takip eder" paket aramalarına dikkat edin. Örneğin, bir çerçeve sınıfı Foo, bir kaynak yüklemek için NSBundle(forClass: self.dynamicType) kullanıyorsa, uygulamanın yüklediği uygulama tarafından tanımlanan Foo alt sınıfı, çerçeve paketi yerine uygulama paketine bakacaktır. Dinamik bir şey yok

struct Foo { 
    class Bar {} 
    static var fooBundle: NSBundle { return NSBundle(forClass: Foo.Bar.self) } 
} 

Not: Bir gerekmiyorsa

bir alt tipi olarak bir sınıf tanımlamak için bir yapı (veya enum) için paket araması, yararlı olacaktır tek çözüm olduğunu "türü aşağıdaki" Burada, hiçbir şey olması gerekmediğinden - her Foo, aynı tür tanımdan gelir (yapılar yapılamamaktadır), dolayısıyla statik türü dinamik türüyle eşleşir.

(Kuşkusuz, yapılar, Çeteleler ele verebilir ve protokoller bir nice feature request yapabilir. Gerçi buna uzantıları ve her şeyi idare yapmak zor olabilir hayal bir NSBundle(forType:) ...)

0

Bir yapıda NSBundle alamazsınız, çünkü yapıları devralamaz.

sınıf NSBundle her zaman yalnızca sınıfları ondan devralabilir, bu durumda NSObject bir alt kümesidir tek sınıf bekliyor.

tip örnekleri küçük ve sık kısa ömürlü olan veya yaygın diğer nesnelerin gömülü eğer bir yapı kullanmayı deneyin. diğer durumlar için sınıf kullanın.

Genellikle sadece durumunda yapılar kullanın:

  • Modelleri ve varlıkları 16 byte altında
  • Immutable (Tüm, ama birçok durumda)
  • Örnek boyutunu nesneleri.