gpt4 book ai didi

swift - 为什么未解析的泛型类型在泛型中是合法的?

转载 作者:行者123 更新时间:2023-12-03 13:37:26 26 4
gpt4 key购买 nike

也许我是非常密集,我意识到我应该知道这种事情,但我对此感到惊讶:

class Wrapper<T> {
let value: T
var wrapper: Wrapper? // ok
init(value: T) {
self.value = value
}
}
class Thing {
var wrapper: Wrapper? // error
}
错误是在类 Thing 中,我必须在声明类型时解析 Wrapper 泛型;我需要说,例如,
var wrapper: Wrapper<String>?
为什么在 Wrapper 中声明一个属性具有 Wrapper 类型而不是其他地方是合法的?是什么让 Wrapper 内部的声明正常?是不是因为编译器只是假设在 Wrapper 内部, Wrapper意味着 Wrapper<T> ?

最佳答案

Wrapper的情况下, T已知,因为它是 Wrapper 的一部分的定义,所以使用 Wrapper没有特化被隐式假定为 Wrapper<T>Thing的情况下,没有T定义,即使有,也不一样 TWrapper .认为它类似于这些功能:

func foo(_ x: Int) {
// x is known here
}

func bar() {
// x is unheard of here.
}

func foobar(_ x: Int) {
// x is known here, but it's not the same x as in foo
}
当然不同的是,即使 foo必须引用 x明确地,而 Wrapper可以推断 T在它自己的定义内。事实上,如果 Wrapper想引用另一个 Wrapper这是专门针对不同类型的,它必须明确说明:
class Wrapper<T> {
...
func someConversion<U>(otherWrapper: Wrapper<U>) {
}
}
Thing另一方面是在 Wrapper 之外声明的,所以它不知道 T .所以从它的角度来看
var wrapper: Wrapper?
就像没有意义一样
var values: Array?
如果编译器不知道 Element,它就不能创建数组。类型。它也不能创建您的 Wrapper不知道是什么 T是。

关于swift - 为什么未解析的泛型类型在泛型中是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66787380/

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