2015-07-09 14 views
17

Trong Swift, bạn có thể gọiCách lấy gói cho cấu trúc?

let bundle = NSBundle(forClass: self.dynamicType) 

trong bất kỳ lớp và nhận được bó hiện hành. Nếu bạn NSBundle.mainBundle() điều này sẽ không nhận được gói đúng khi ví dụ như chạy thử nghiệm đơn vị.

Vậy làm cách nào để bạn có được gói hiện tại cho Swift struct?

+0

Cũng tìm kiếm một câu trả lời cho điều này .. Tôi hiện đang có một định nghĩa lớp giữ chỗ và một phần mở rộng 'NSBundle' giúp đỡ để tôi có thể tiếp tục làm việc cho đến khi một giải pháp thích hợp được tìm thấy –

Trả lời

14

Giải pháp tốt nhất ở đây phụ thuộc vào những gì bạn cần một gói.

Tài khoản có tìm kiếm tài nguyên chỉ tồn tại trong một gói ứng dụng, khung công cụ hoặc tiện ích mở rộng cụ thể được biết là được tải khi mã bạn đang viết chạy không? Trong trường hợp đó, bạn có thể muốn sử dụng init(identifier:) thay vì tự động tìm kiếm gói xác định một loại nhất định.

Hãy coi chừng "theo dõi loại" gói tra cứu. Ví dụ: nếu một lớp khung Foo sử dụng NSBundle(forClass: self.dynamicType) để tải tài nguyên, một lớp con của Foo được xác định bởi ứng dụng tải khung đó sẽ kết thúc tìm trong gói ứng dụng thay vì gói khung.

Nếu bạn cần một "theo kiểu" bó tra cứu cho một cấu trúc (hoặc enum), một trong những cách giải quyết mà có thể chứng minh hữu ích được định nghĩa một lớp như một subtype:

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

Lưu ý không có gì động ở đây, bởi vì không có gì cần phải có - mỗi Foo xuất phát từ cùng một định nghĩa kiểu (vì cấu trúc không thể kế thừa), vì vậy kiểu tĩnh của nó khớp với kiểu động của nó.

(Phải thừa nhận rằng, một NSBundle(forType:) mà có thể xử lý cấu trúc, sự đếm, và các giao thức có thể làm cho một nice feature request. Mặc dù tôi tưởng tượng nó có thể là khó khăn để làm cho nó xử lý phần mở rộng và tất cả mọi thứ ...)

0

Bạn không thể lấy NSBundle từ cấu trúc, vì cấu trúc không thể kế thừa.

Lớp NSBundle luôn mong đợi một lớp là tập hợp con của NSObject, trong trường hợp này chỉ có các lớp có thể kế thừa từ nó.

Cố gắng sử dụng cấu trúc nếu các phiên bản loại nhỏ và thường tồn tại trong thời gian ngắn hoặc thường được nhúng trong các đối tượng khác. cho các trường hợp khác sử dụng lớp.

Thông thường tôi chỉ sử dụng cấu trúc trong trường hợp:

  • Models và Các đối tượng đối tượng
  • Immutable (Không phải tất cả, nhưng trong hầu hết các trường hợp)
  • kích thước Instance dưới 16 byte.
Các vấn đề liên quan