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

时间:2017-10-29 23:27:18

标签: 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!
    }


}

这会编译,但如果我想这样使用它。

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!
    }

}

1 个答案:

答案 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"