Swift tương đương với [NSBundle bundleForClass: [self class]]


131

Swift tương đương với mã tiếp theo là gì:

[NSBundle bundleForClass:[self class]]

Tôi cần tải tài nguyên từ gói thử nghiệm (dữ liệu JSON)

Câu trả lời:


222

Không bao giờ được sử dụng, nhưng tôi nghĩ nó nên như thế này:

Swift <= 2.x

NSBundle(forClass: self.dynamicType)

Swift 3.x

Bundle(for: type(of: self))

39
Tự động hoàn tất trong phiên bản Xcode hiện tại hoạt động như thể nó không biết bạn đang nói về cái gì, nhưng nó thực sự hoạt động.
David Beck

4
trong phiên bản 2.1: NSBundle (forClass: self)
zwebie

Chủ đề tiến hóa để xem xét thay đổi điều này là tại github.com/apple/swift-evolution/blob/master/proposeals/ gợi
William Entriken

1
Giải pháp không hoạt động đối với các loại giá trị. Xem xét sử dụng init?(identifier: String)nơi định danh là ID gói mục tiêu của bạn. Một giải pháp khác cho các loại giá trị là khai báo một lớp trống bên trong loại giá trị của bạn. Ví dụ về giải pháp sau: Bundle(for: Foo.Bar.self)where Foo- struct của bạn, Bar- một số lớp bên trong.
Vadim Bulavin

1
Điều này không hoạt động trong Swift 3.1. type(of: self)sẽ quay lại ClassName.Typevà gọi Bundle(for:)tới đó trả về gói chính
adib

38

Swift 3:

Bundle(for: type(of: self))

3
Giải pháp không hoạt động đối với các loại giá trị. Xem xét sử dụng init?(identifier: String)nơi định danh là ID gói mục tiêu của bạn. Nếu bạn không muốn mã hóa ID gói, hãy sử dụng Bundle(for: Foo.Bar.self)vị trí Foo- cấu trúc của bạn Bar- một số lớp bên trong.
Vadim Bulavin

12

Cá nhân tôi thích:

let bun = NSBundle(forClass: self.classForCoder)



7

Câu trả lời được chọn không hoạt động với tôi trong một phương thức tĩnh của lớp con UIView, nhưng tôi đã tìm thấy điều này:

Bundle(for: self.classForCoder)

Điều này cũng hoạt động khi bạn muốn đạt được Bundlemục tiêu thử nghiệm.


6

Nếu bạn đang làm việc trên một lớp thì

Bundle(for: type(of: self))

Đôi khi bạn có thể làm việc trong một cấu trúc, sau đó bạn cần sử dụng bất kỳ lớp nào trong gói

Bundle(for: AnyClassInTheBundle.self)

4

Đang tải xib cho DynamicType của lớp

    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: "CellForAlert", bundle: bundle)
    let view =  nib.instantiateWithOwner(self, options: nil).first as! UIView
    view.frame = bounds
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    self.addSubview(view);

-1

Trong Swift 3.0, bạn có thể sử dụng:

func kZWGetBundle() -> Bundle{
    return Bundle(for: AnyClass.self as! AnyClass)
}

1
Nó chỉ gặp sự cố
Alexander Belyavskiy

Tai nạn đối với tôi cũng vậy, đã bỏ phiếu cho việc sử dụng lực lượng unrap trong mã mẫu.
SafeFastExpressive
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.