【问题标题】:Swift equivalent of [NSBundle bundleForClass:[self class]][NSBundle bundleForClass:[self class]] 的 Swift 等价物
【发布时间】:2014-09-03 18:39:34
【问题描述】:

下一个代码的 swift 等价物是什么:

[NSBundle bundleForClass:[self class]]

我需要从测试包加载资源(JSON 数据)

【问题讨论】:

    标签: swift


    【解决方案1】:

    斯威夫特 5

    Bundle(for: Self.self)
    

    【讨论】:

      【解决方案2】:

      如果你正在上课,那么

      Bundle(for: type(of: self))
      

      有时你可能在一个结构中工作,那么你需要使用包中的任何类

      Bundle(for: AnyClassInTheBundle.self)
      

      【讨论】:

        【解决方案3】:

        没用过,不过我觉得应该是这样的:

        斯威夫特

        NSBundle(forClass: self.dynamicType)
        

        Swift 3.x

        Bundle(for: type(of: self))
        

        【讨论】:

        • 当前版本的 Xcode 中的自动完成功能就像它不知道你在说什么,但它确实有效。
        • 在 2.1 版中:NSBundle(forClass: self)
        • 考虑改变这一点的进化线程位于github.com/apple/swift-evolution/blob/master/proposals/…
        • 该解决方案不适用于值类型。考虑使用init?(identifier: String),其中标识符是您的目标的捆绑ID。值类型的另一个解决方案是在值类型中声明一个空类。后一种解决方案的示例:Bundle(for: Foo.Bar.self) 其中Foo - 你的结构,Bar - 一些内部类。
        • 这在 Swift 3.1 中不起作用。 type(of: self) 将返回 ClassName.Type 并调用 Bundle(for:)返回主包
        【解决方案4】:

        斯威夫特 3:

        Bundle(for: type(of: self))
        

        【讨论】:

        • 该解决方案不适用于值类型。考虑使用init?(identifier: String),其中标识符是您的目标的捆绑ID。如果您不想硬编码捆绑 ID,请使用 Bundle(for: Foo.Bar.self) 其中 Foo - 你的结构,Bar - 一些内部类。
        【解决方案5】:

        为类的dynamicType加载xib

            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);
        

        【讨论】:

          【解决方案6】:

          在 UIView 子类的静态方法中,所选答案对我不起作用,但我发现:

          Bundle(for: self.classForCoder)
          

          当您想在测试目标中获取 Bundle 时,这也适用。

          【讨论】:

            【解决方案7】:

            我个人喜欢:

            let bun = NSBundle(forClass: self.classForCoder)
            

            【讨论】:

              【解决方案8】:
              let bundle = NSBundle(forClass:object_getClass(self))
              

              【讨论】:

                【解决方案9】:

                在 Swift 3.0 中,您可以使用:

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

                【讨论】:

                • 它只是崩溃
                • 我也崩溃了,在示例代码中使用强制解包被否决。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-07-02
                • 1970-01-01
                • 1970-01-01
                • 2016-03-21
                • 2014-07-23
                相关资源
                最近更新 更多