为什么需要强制将属性强制转换为具有与属性相同签名的通用方法?

道伊

这是我的代码:

class GenericClass<T: UITableViewCell> {

    let enumProperty = SomeEnum.myValue

    enum SomeEnum {
        case myValue
    }

    func callOtherClass() {
        OtherClass.handle(property: enumProperty) // Compile error
    }
}

class OtherClass {
    static func handle(property: GenericClass<UITableViewCell>.SomeEnum) {}
}

为什么会出现编译错误:

无法将类型'GenericClass.SomeEnum'的值转换为预期的参数类型'GenericClass.SomeEnum'

当然,解决方法是添加演员表:

as! GenericClass<UITableViewCell>.SomeEnum

这导致这个丑陋的代码:

func callOtherClass() {
    OtherClass.handle(property: enumProperty) as! GenericClass<UITableViewCell>.SomeEnum
}

但是为什么我需要投射?self被定义为GenericClass,其中T始终为UITableViewCell该方法handle需要该签名。

在某些情况下是否需要这种强制转换,因为在某些情况下,这种转换将会/可能会失败?我不希望斯威夫特只是随机要求我插入强制施放。我希望Swift可以推断出类型并认为它是安全的,但是无论如何,Swift与我不同意。

罗布·纳皮尔

这里的问题SomeEnum是实际上GenericClass<T>.SomeEnum没有任何保证T是完全正确的UITableViewCell,因此它与GenericClass<UITableViewCell>泛型不是协变的不兼容

通常,在这种情况下,您想要做的是移至SomeEnum之外GenericClass,因为关于它的任何事情实际上都不是通用的:

enum SomeEnum {
    case myValue
}

class GenericClass<T: UITableViewCell> {

    let enumProperty = SomeEnum.myValue

    func callOtherClass() {
        OtherClass.handle(property: enumProperty) // Compile error
    }
}

class OtherClass {
    static func handle(property: SomeEnum) {}
}

但是,如果有一个通用的原因,请参见Robert Dresler的答案,这就是您正确地对该函数进行专业化处理的方式:

class OtherClass {
    static func handle<T: UITableViewCell>(property: GenericClass<T>.SomeEnum) {}
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将具有强制属性的对象转换为具有相同可选属性的对象

来自分类Dev

从通用父类返回“ this”需要强制转换为子类

来自分类Dev

双重推导-为什么需要强制转换

来自分类Dev

为什么此代码需要强制转换?

来自分类Dev

为什么要强制转换为指针然后取消引用?

来自分类Dev

为什么使用 compose 方法需要强制转换,而不使用 andThen 方法

来自分类Java

为什么将变量声明为int类型需要强制转换流?长型不需要强制转换

来自分类Dev

为什么需要强制转换 Java 泛型方法参数类

来自分类Java

Java Casting方法,不知道要强制转换为什么

来自分类Dev

使用对象分解分配时,为什么将属性“名称”强制转换为字符串?

来自分类Dev

将具有可选属性的强制类型转换为可索引类型

来自分类Dev

转换为装箱语法需要强制转换UIBarMetrics警告

来自分类Dev

将变量设置为具有与属性相同的值

来自分类Dev

为什么一个接口实现需要强制转换而另一种则不需要强制转换?

来自分类Dev

为什么将通用返回类型强制转换为另一个通用类型?

来自分类Dev

为什么在这种情况下需要强制转换?

来自分类Java

为什么在这种情况下需要强制转换?

来自分类Dev

为什么我需要强制转换才能从基类访问实际值?

来自分类Java

为什么Java的+ =,-=,* =,/ =复合赋值运算符不需要强制转换?

来自分类Dev

为什么在调用IEnumerable.Contains()时需要强制转换动态对象?

来自分类Dev

当where约束应该足够时,为什么需要强制转换泛型类型

来自分类Dev

为什么在此Java示例中需要强制转换HttpURLConnection?

来自分类Dev

postgres varchar需要强制转换

来自分类Dev

通用方法将T强制转换为对象类型

来自分类Dev

为什么仅在有时表示最小整数(32位系统)时才需要强制转换(带符号)?

来自分类Dev

为什么在c#中将对象强制转换为具有相同值的T类型的对象时,识别的对象不相同?

来自分类Dev

为什么我需要将方法强制转换为“动作”或“功能”以在值元组中使用它?

来自分类Dev

转换具有类签名中通用属性的具体类型

来自分类Dev

将通用T强制转换为Object []

Related 相关文章

  1. 1

    将具有强制属性的对象转换为具有相同可选属性的对象

  2. 2

    从通用父类返回“ this”需要强制转换为子类

  3. 3

    双重推导-为什么需要强制转换

  4. 4

    为什么此代码需要强制转换?

  5. 5

    为什么要强制转换为指针然后取消引用?

  6. 6

    为什么使用 compose 方法需要强制转换,而不使用 andThen 方法

  7. 7

    为什么将变量声明为int类型需要强制转换流?长型不需要强制转换

  8. 8

    为什么需要强制转换 Java 泛型方法参数类

  9. 9

    Java Casting方法,不知道要强制转换为什么

  10. 10

    使用对象分解分配时,为什么将属性“名称”强制转换为字符串?

  11. 11

    将具有可选属性的强制类型转换为可索引类型

  12. 12

    转换为装箱语法需要强制转换UIBarMetrics警告

  13. 13

    将变量设置为具有与属性相同的值

  14. 14

    为什么一个接口实现需要强制转换而另一种则不需要强制转换?

  15. 15

    为什么将通用返回类型强制转换为另一个通用类型?

  16. 16

    为什么在这种情况下需要强制转换?

  17. 17

    为什么在这种情况下需要强制转换?

  18. 18

    为什么我需要强制转换才能从基类访问实际值?

  19. 19

    为什么Java的+ =,-=,* =,/ =复合赋值运算符不需要强制转换?

  20. 20

    为什么在调用IEnumerable.Contains()时需要强制转换动态对象?

  21. 21

    当where约束应该足够时,为什么需要强制转换泛型类型

  22. 22

    为什么在此Java示例中需要强制转换HttpURLConnection?

  23. 23

    postgres varchar需要强制转换

  24. 24

    通用方法将T强制转换为对象类型

  25. 25

    为什么仅在有时表示最小整数(32位系统)时才需要强制转换(带符号)?

  26. 26

    为什么在c#中将对象强制转换为具有相同值的T类型的对象时,识别的对象不相同?

  27. 27

    为什么我需要将方法强制转换为“动作”或“功能”以在值元组中使用它?

  28. 28

    转换具有类签名中通用属性的具体类型

  29. 29

    将通用T强制转换为Object []

热门标签

归档