swift - 扩展中的类函数转换为自身

标签 swift

我正在尝试创建一个用于加载 UIView 的扩展来自 XIB 的(和子类)。我们的愿望是让扩展返回UIView的特定子类。 。这是我到目前为止所得到的:

extension UIView {

    class func instantiateNIB(name: String, bundle: NSBundle? = nil) -> UIView? {
        let nib = UINib(nibName: name, bundle: bundle)
        let views = nib.instantiateWithOwner(nil, options: nil)

        for view in views {
            if let match = view as? UIView {
                return match
            }
        }

        return nil
    }

}

然后:

let spinner: Spinner = Spinner.instantiateNIB("Spinner") as! Spinner
let rater: Rater = Rater.instantiateNIB("Rater") as! Rater

问题是此方法始终返回 UIView这需要在后续调用中强制向下转换。是否可以修改它以自动执行向下转换?例如:

let spinner = Spinner.instantiateNIB(name: "Spinner")
let rater = Rater.instantiateNIB(name: "Rater")

最佳答案

试试这个:

extension UIView {

    class func instantiateNIB(name: String, bundle: NSBundle? = nil) -> Self? {
        return instantiateNIB(self, name: name, bundle: bundle)
    }

    private class func instantiateNIB<T>(type: T.Type, name: String, bundle: NSBundle? = nil) -> T? {
        let nib = UINib(nibName: name, bundle: bundle)
        let views = nib.instantiateWithOwner(nil, options: nil)

        for view in views {
            if let match = view as? T {
                return match
            }
        }

        return nil
    }

}

关于swift - 扩展中的类函数转换为自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389069/

相关文章:

arrays - 将数组与 -nan 进行比较

ios - 以编程方式使用大小类设置字体大小

swift - 为什么这段 Swift 代码会泄漏内存,我该如何处理?

Swift Promises - 重新加载数据方法未绑定(bind)数据

ios - Swift - 拍照或选择现有的

swift - ReactiveKit 主题 "unobserveNext"方法?

iOS swift : Update navigation button with "Back" text

ios - 如何在 uicollectionview 中设置我的 UIButton 标题

ios - 以 Button 中类型为 NSException 的未捕获异常终止

ios - 可以从设备上的不同应用程序访问的 ios 组件