无法分配泛型类型的值

Evg*_*lov 6 generics ios swift

我有通用课 - Class1.

class Class1<T> {
}
Run Code Online (Sandbox Code Playgroud)

我有类型和泛型类型的Class2变量object1Class1UIView

class Class2 {
    var object1: Class1<UIView>?
}
Run Code Online (Sandbox Code Playgroud)

当我创建实例Class2并尝试分配object1类型Class1和泛型类型的实例时,UITableView我收到一个错误:"无法指定类型的值Class1<UITableView>来键入Class1<UIView>"

var c = Class2()
c.object1 = Class1<UITableView>()
Run Code Online (Sandbox Code Playgroud)

但是,相同的逻辑适用于Array.为什么?

在此输入图像描述

thm*_*thm 2

让我详细说明 Anton\xe2\x80\x99s 的评论。问题是何时可以使用 B 代替 A。通常,当 B 是 A 的子类型时,您可以这样做。例如,您可以将 a 分配UITableView给类型为 的变量UIView

\n\n

那么什么时候某个东西是其他东西的子类型呢?

\n\n

对于类,这很简单:如果您B从进行子类化AB则 是 的子类型A

\n\n

对于函数类型,您需要考虑参数类型和返回类型。如果\xe2\x80\x99s 参数类型是\ F2xe2 \x80\x99s 参数的超类型,并且\xe2\x80\x99s 返回类型是 \xe2\ x80\x99s 返回类型的子类型,则函数类型是函数类型的子类型。你可以说,一个函数不能要求 more(即它不能要求子类型作为参数,但可以要求超类型),也不能提供 less(即它不能返回超类型,但可以返回子类型),因为它的类型是子类型。术语是参数类型必须是逆变的,返回类型必须是协变的F1F2F1F2F1

\n\n

例子:

\n\n
var f1: UIControl -> UIControl = ...\n\nlet f2: UIView -> UIControl = ...\nlet f3: UIControl -> UIButton = ...\nlet f4: UIView -> UIButton = ...\nf1 = f2  // Fine, f2 takes UIView so it also takes UIControl\nf1 = f3  // Fine, f3 returns UIButton which is a UIControl\nf1 = f4  // Fine, both of the above\n\nlet f5: UIButton -> UIControl\nlet f6: UIControl -> UIView\nlet f7: UIButton -> UIView\nf1 = f5  // Error, couldn\xe2\x80\x99t call with a UIControl because f5 demands at least a UIButton\nf1 = f6  // Error, call would return only a UIView\nf1 = f7  // Error, both of the above\n
Run Code Online (Sandbox Code Playgroud)\n\n

f2因此, f3, 和的类型f4是 \xe2\x80\x99s 类型的子类型,而, , 和 的f1类型不是。f5f6f7

\n\n

现在泛型类型怎么样?在 Swift 中,带有类型参数的自定义类型都是invariant。也就是说,在您的示例中,无论和之间的关系如何(除非和为同一类型),都不Class1<T2>能将对象用作对象。Class1<T1>T1T2T1T2

\n\n

然而,Swift 确实有一些内置的方差规则,使您的数组示例能够工作:( [UITableView])是( )Array<UITableView>的子类型。请注意,对于可选值也是如此,即( ) 是( )的子类型。因此数组和可选值都与其类型参数协变。[UIView]Array<UIView>UITableView?Optional<UITableView>UIView?Optional<UIView>

\n\n

进一步阅读:

\n\n\n