เทียบเท่ากับ [NSBundle bundleForClass: [self class]]


131

Swift เทียบเท่ากับรหัสถัดไปคืออะไร:

[NSBundle bundleForClass:[self class]]

ฉันต้องการโหลดทรัพยากรจากชุดทดสอบ (ข้อมูล JSON)

คำตอบ:


222

ไม่เคยใช้ แต่ฉันคิดว่ามันควรจะเป็น:

รวดเร็ว <= 2.x

NSBundle(forClass: self.dynamicType)

สวิฟต์ 3.x

Bundle(for: type(of: self))

39
การเติมข้อความอัตโนมัติใน Xcode เวอร์ชันปัจจุบันทำหน้าที่เหมือนไม่รู้ว่าคุณกำลังพูดถึงอะไร แต่มันใช้งานได้จริง
David Beck

4
ในเวอร์ชัน 2.1: NSBundle (forClass: self)
zwebie

เธรดวิวัฒนาการที่จะต้องพิจารณาการเปลี่ยนแปลงนี้อยู่ที่github.com/apple/swift-evolution/blob/master/proposals/…
William Entriken

1
โซลูชันนี้ใช้ไม่ได้กับประเภทค่า พิจารณาใช้โดยinit?(identifier: String)ที่ตัวระบุคือรหัสกลุ่มเป้าหมายของคุณ อีกวิธีหนึ่งสำหรับชนิดค่าคือการประกาศคลาสว่างภายในประเภทค่าของคุณ ตัวอย่างของวิธีแก้ปัญหาหลัง: Bundle(for: Foo.Bar.self)โดยที่Foo- โครงสร้างของคุณBar- คลาสภายในบางส่วน
Vadim Bulavin

1
สิ่งนี้ใช้ไม่ได้ใน Swift 3.1 type(of: self)จะกลับมาClassName.TypeและเรียกBundle(for:)ไปที่ส่งคืนชุดหลัก
adib

38

Swift 3:

Bundle(for: type(of: self))

3
โซลูชันนี้ใช้ไม่ได้กับประเภทค่า พิจารณาใช้โดยinit?(identifier: String)ที่ตัวระบุคือรหัสกลุ่มเป้าหมายของคุณ หากคุณไม่ต้องการฮาร์ดโค้ดบันเดิล ID ให้ใช้Bundle(for: Foo.Bar.self)where Foo- โครงสร้างของคุณBar- คลาสภายใน
Vadim Bulavin




7

คำตอบที่เลือกไม่ได้ผลสำหรับฉันในวิธีการคงที่ของคลาสย่อย UIView แต่ฉันพบสิ่งนี้:

Bundle(for: self.classForCoder)

นอกจากนี้ยังใช้ได้ผลเมื่อคุณต้องการได้รับBundleภายในเป้าหมายการทดสอบ


6

หากคุณกำลังทำงานในชั้นเรียนแล้ว

Bundle(for: type(of: self))

บางครั้งคุณอาจทำงานในโครงสร้างจากนั้นคุณต้องใช้คลาสใดก็ได้ในบันเดิล

Bundle(for: AnyClassInTheBundle.self)

4

กำลังโหลด xib สำหรับ dynamicType ของคลาส

    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

ใน Swift 3.0 คุณสามารถใช้:

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

1
มันขัดข้อง
Alexander Belyavskiy

ขัดข้องสำหรับฉันด้วยเช่นกันโหวตให้ใช้การบังคับแกะโค้ดตัวอย่าง
SafeFastExpressive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.