如何在Swift扩展中使用包装器类型参数

如何在Swift扩展中使用包装器类型参数,swift,generics,Swift,Generics,我想在我的类型扩展中介绍一些类型之间的连接。考虑下面的例子。 struct Wrapper<T> { var target: T? } struct Container<T> { var wrapper: T? } extension Container where T == Wrapper<Any> { func unwrap() -> Any { return wrapper!.target! }

我想在我的类型扩展中介绍一些类型之间的连接。考虑下面的例子。

struct Wrapper<T> {
    var target: T?
}

struct Container<T> {
    var wrapper: T?
}

extension Container where T == Wrapper<Any> {

    func unwrap() -> Any {
        return wrapper!.target!
    }


}
struct包装器{
var目标:T?
}
结构容器{
var包装器:T?
}
扩展容器,其中T==包装器{
func unwrap()->任意{
返回包装器!目标!
}
}
这可以编译,但如果我想这样使用它

var wrapper = Wrapper<String>()
wrapper.target = "foo"
var container = Container<Wrapper<String>>()
container.wrapper = wrapper
let string: String  = container.unwrap()
var wrapper=wrapper()
wrapper.target=“foo”
var container=container()
container.wrapper=包装器
let string:string=container.unwrap()
以上代码以编译错误结束

Container<Wrapper<String>>' is not convertible to 'Container<Wrapper<Any>>
Container'不能转换为Container
我想说清楚。是否有方法表明扩展约束中的类型参数是新方法的返回类型。所以它可以用在类似的地方

extension Container where T == Wrapper<NEWTYPEARGUMENT> {

    func unwrap() -> NEWTYPEARGUMENT {
        return wrapper!.target!
    }

}
扩展容器,其中T==包装器{
func unwrap()->NEWTYPEARGUMENT{
返回包装器!目标!
}
}

目前,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"
扩展容器{
func unwrap()->U其中T==包装器{
返回包装器!目标!
}
}
var wrapper=wrapper()
wrapper.target=“foo”
var container=container()
container.wrapper=包装器
let string:string=container.unwrap()/“foo”

谢谢,这正是我想要的