我想在我的类型扩展中介绍类型之间的一些连接。请考虑以下示例。
struct Wrapper<T> {
var target: T?
}
struct Container<T> {
var wrapper: T?
}
extension Container where T == Wrapper<Any> {
func unwrap() -> Any {
return wrapper!.target!
}
}
这会编译,但如果我想这样使用它。
var wrapper = Wrapper<String>()
wrapper.target = "foo"
var container = Container<Wrapper<String>>()
container.wrapper = wrapper
let string: String = container.unwrap()
上面的代码以编译错误结束
Container<Wrapper<String>>' is not convertible to 'Container<Wrapper<Any>>
所以要清楚。有没有办法表明扩展约束的类型参数是新方法的返回类型。所以可以使用它
extension Container where T == Wrapper<NEWTYPEARGUMENT> {
func unwrap() -> NEWTYPEARGUMENT {
return wrapper!.target!
}
}
答案 0 :(得分:2)
目前,Swift并不支持使用where子句在扩展中引入泛型类型约束。但是,您可以通过使用where子句将类型约束直接引入泛型函数来实现您要做的事情。
extension Container {
func unwrap<U>() -> U where T == Wrapper<U> {
return wrapper!.target!
}
}
var wrapper = Wrapper<String>()
wrapper.target = "foo"
var container = Container<Wrapper<String>>()
container.wrapper = wrapper
let string: String = container.unwrap() //"foo"