【发布时间】:2018-08-21 17:36:32
【问题描述】:
我正在实现一个需要符合如下协议的类:
protocol P {
func magic<T>(_ thing: Thing, as type: T.Type) -> T
}
此协议由第三方代码提供,这意味着我无法以任何方式更改它以解决此问题。
现在,我有一个通用函数
func magicForObject<T: AnyObject>(_ thing: Thing, as type: T.Type) -> T
我想在magic 的实现中调用它,只是为了输入things,它们实际上是对象。
也就是说,我想做这样的事情:
func magic<T>(_ thing: Thing, as type: T.Type) -> T {
if T.self is AnyClass {
return magicForObject(thing, as: type)
}
else {
// do something else
}
}
但我找不到任何方法来完成这项工作。上面的代码显然不能编译,像
这样的东西也不能编译if let T_ = T.self as? AnyClass { ... }
因为T_ 只是一个普通变量,而不是泛型参数(可能是编译时)。
我也试过这样做:
func magic<T: AnyObject>(_ thing: Thing, as type: T.Type) -> T { ... }
func magic<T>(_ thing: Thing, as type: T.Type) -> T { ... }
并分别实现两者。如果直接在对象上调用此函数,则会正确调用受约束的AnyObject,但当对象转换为协议类型P 时,不会,在这种情况下,总是使用第二个。
这种情况似乎受到了无可救药的限制,但有没有我没有想到的解决方法?
更新
目前看来,这在 Swift 中是不可能的。我在 Swift 论坛中创建了 post pitching the idea;如果这也是您需要的,请随时加入。
【问题讨论】:
-
所以你要做的是检查
magic中的泛型参数是否是class然后你想对该类做一些事情并从magicForObject返回它而不是structs。我理解正确吗?您还为协议提供自己的默认实现吗? -
@Serj 是的,如果
Tmagic是一个类类型,我希望能够获得某种T_: AnyObject,这样我就可以调用magicForObject,否则做一些事情else 用于结构等。这不是P的默认实现,我只是有一个需要符合P的类。