gpt4 book ai didi

swift - 为什么我需要将属性强制转换为与属性具有相同签名的泛型方法?

转载 作者:可可西里 更新时间:2023-11-01 00:38:37 27 4
gpt4 key购买 nike

这是我的代码:

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) {}
}

为什么会出现编译错误:

Cannot convert value of type 'GenericClass.SomeEnum' to expected argument type 'GenericClass.SomeEnum'

当然,解决方法是添加类型转换:

as! GenericClass<UITableViewCell>.SomeEnum

导致这段难看的代码:

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

但为什么我需要转换? self 定义为 GenericClass,其中 T 始终是 UITableViewCellhandle 方法需要该签名。

在某些情况下是否需要此转换,因为在某些情况下会/可能会失败?我不希望 Swift 只是随机要求我插入强制转换。我希望 Swift 可以推断类型并认为它是安全的,但不知何故,Swift 不同意我的看法。

最佳答案

这里的问题是 SomeEnum实际上是 GenericClass<T>.SomeEnum .没有人 promise T正是UITableViewCell , 所以它与 GenericClass<UITableViewCell> 不兼容(generics are not covariant)。

通常在这种情况下,您要做的是移动 SomeEnumGenericClass之外,因为它实际上没有任何内容是通用的:

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) {}
}

关于swift - 为什么我需要将属性强制转换为与属性具有相同签名的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54468558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com