泛型:有没有办法让编译器检查T是否是特定的UIView子类?

Cheok Yan Cheng

当前,我具有以下便捷的通用函数,该函数使我能够从XIB创建自定义视图

extension UIView {
    static func instanceFromNib<T: UIView>() -> T {
        return UINib(nibName: String(describing: self), bundle: nil).instantiate(withOwner: self, options: nil)[0] as! T
    }
}

用法是

let colorPickerView: ColorPickerView
// Returned type from ColorPickerView.instanceFromNib is UIView, not ColorPickerView.
colorPickerView = ColorPickerView.instanceFromNib()

但是,编译器只能从ColorPickerView.instanceFromNibis知道返回值UIView它不知道返回值的ColorPickerView.instanceFromNib其实ColorPickerView

以下代码将毫无问题地进行编译,但会导致运行时错误。

let colorPickerView: UIButton  // UIButton is child of UIView.
// Returned type from ColorPickerView.instanceFromNib is UIView, not ColorPickerView.
colorPickerView = ColorPickerView.instanceFromNib()

我想知道,是否有办法进一步改善上述通用功能,以便我们能够

// No issue. Returned type from CustomView1.instanceFromNib is CustomView1. 
let customView1: CustomView1 = CustomView1.instanceFromNib()

// No issue. Returned type from CustomView2.instanceFromNib is CustomView2. 
let customView2: CustomView2 = CustomView2.instanceFromNib()

// Compile error. Compiler knows the returned type is CustomView1.
let customView3: CustomView3 = CustomView1.instanceFromNib()
罗布·纳皮尔

您可以改进它,使上面的代码失败,但是永远不能确定它的类型正确。

要处理上面的代码,您只需更改instanceFromNib()为返回Self,而不是“无论键入呼叫者请求的内容”。

static func instanceFromNib() -> Self {
    UINib(nibName: String(describing: self), bundle: nil)
        .instantiate(withOwner: self, options: nil)[0] as! Self
}

但是该NIB仍可能持有错误的类型,并且只有在运行时才会发现该错误,因为您必须从文件中加载数据才能知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法检查编译器是否内联C ++ lambda函数?

来自分类Dev

有没有办法检查使用泛型使用什么变量类型?

来自分类Dev

有没有办法从Rust程序中检测编译器版本?

来自分类Dev

有没有办法让 Swift 编译器忽略错误?

来自分类Dev

有没有办法在没有泛型的情况下确保Java在编译时的类型安全

来自分类Dev

有没有办法检查$ _POST是否存在?

来自分类Dev

从编译器获取参数时,有没有办法避免预处理器宏?

来自分类Dev

有没有办法检查服务器上是否打开了某个端口?

来自分类Dev

有没有办法在依赖项中强制执行编译器目标版本?

来自分类Dev

从临时返回按值的string_view时,有没有办法得到编译器警告?

来自分类Dev

有没有办法在较旧的C / C ++编译器中使用C ++ 11线程对象

来自分类Dev

有没有办法重新排列由TypeScript编译器生成的JavaScript模块?

来自分类Dev

有没有办法“告诉” IntelliSense 和编译器该类实现了接口而不实际实现它?

来自分类Dev

在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

来自分类Dev

Java泛型中有没有办法说“ T扩展事物或T扩展SomethingElse”?

来自分类Dev

有没有办法传递带有泛型参数的函数指针?

来自分类Dev

有没有办法检查现有对象是否包含特定的字符串参数?

来自分类Dev

有没有办法使两个类使用相同的泛型?

来自分类Dev

有没有办法在TypeScript中实例化受约束的泛型类型的实例?

来自分类Dev

有没有办法在方法声明中定义两个泛型类型

来自分类Dev

有没有办法从其属性推断泛型参数?

来自分类Dev

有没有办法检查特定行中的字段是否已更改,而无需为每个字段编写侦听器?

来自分类Dev

有没有办法返回作为子类的类型?

来自分类Dev

有没有办法实例化子类而不继承特定属性?

来自分类Dev

Google Closure编译器发出警告:类型不兼容;即使参数具有通用类型,有没有办法解决?

来自分类Dev

有没有办法告诉编译器我正在管理循环中变量的所有权?

来自分类Dev

有没有办法检查两个数组是否具有相同的元素?

来自分类Dev

有没有办法检查Groovy中的类或对象是否具有mixin?

来自分类Dev

有没有办法在淘汰验证模板中检查是否需要?

Related 相关文章

  1. 1

    有没有办法检查编译器是否内联C ++ lambda函数?

  2. 2

    有没有办法检查使用泛型使用什么变量类型?

  3. 3

    有没有办法从Rust程序中检测编译器版本?

  4. 4

    有没有办法让 Swift 编译器忽略错误?

  5. 5

    有没有办法在没有泛型的情况下确保Java在编译时的类型安全

  6. 6

    有没有办法检查$ _POST是否存在?

  7. 7

    从编译器获取参数时,有没有办法避免预处理器宏?

  8. 8

    有没有办法检查服务器上是否打开了某个端口?

  9. 9

    有没有办法在依赖项中强制执行编译器目标版本?

  10. 10

    从临时返回按值的string_view时,有没有办法得到编译器警告?

  11. 11

    有没有办法在较旧的C / C ++编译器中使用C ++ 11线程对象

  12. 12

    有没有办法重新排列由TypeScript编译器生成的JavaScript模块?

  13. 13

    有没有办法“告诉” IntelliSense 和编译器该类实现了接口而不实际实现它?

  14. 14

    在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

  15. 15

    Java泛型中有没有办法说“ T扩展事物或T扩展SomethingElse”?

  16. 16

    有没有办法传递带有泛型参数的函数指针?

  17. 17

    有没有办法检查现有对象是否包含特定的字符串参数?

  18. 18

    有没有办法使两个类使用相同的泛型?

  19. 19

    有没有办法在TypeScript中实例化受约束的泛型类型的实例?

  20. 20

    有没有办法在方法声明中定义两个泛型类型

  21. 21

    有没有办法从其属性推断泛型参数?

  22. 22

    有没有办法检查特定行中的字段是否已更改,而无需为每个字段编写侦听器?

  23. 23

    有没有办法返回作为子类的类型?

  24. 24

    有没有办法实例化子类而不继承特定属性?

  25. 25

    Google Closure编译器发出警告:类型不兼容;即使参数具有通用类型,有没有办法解决?

  26. 26

    有没有办法告诉编译器我正在管理循环中变量的所有权?

  27. 27

    有没有办法检查两个数组是否具有相同的元素?

  28. 28

    有没有办法检查Groovy中的类或对象是否具有mixin?

  29. 29

    有没有办法在淘汰验证模板中检查是否需要?

热门标签

归档