gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 07:07:51 24 4
gpt4 key购买 nike

我想在我的类型扩展中引入一些类型之间的联系。考虑以下示例。

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

}

最佳答案

目前,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"

关于swift - 如何在 Swift 扩展中使用包装器类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47006312/

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