Swift协议作为泛型类型

时间:2016-06-25 04:14:36

标签: swift

我有这样的代码:

protocol MyProtocol {
}

class P1: MyProtocol {
}

class P2: MyProtocol {
}

class C <T: MyProtocol> {
}

然后我需要定义一个变量来委派各种C<MyProtocol>

var obj: C <MyProtocol>

但编译错误来了:

不支持使用'MyProtocol'作为符合协议'MyProtocol'的具体类型

我该怎么办?

2 个答案:

答案 0 :(得分:1)

此代码:

class C <T: MyProtocol> { }

表示C是一个通用类,可以专注于符合 T的任何类型MyProtocol

宣布:

var obj: C <MyProtocol>

你(我认为)试图说var obj将是C的一个实例,专门用于符合MyProtocol的某种类型,但你不能在协议类型上专门化泛型类,因为没有协议的直接具体实例。该协议只能存在符合类型的实例。理论上可以有许多符合协议的不同类型。因此,表示法并没有真正告诉编译器使用C的特定专业化。

这不应该是一个问题,因为你可以编写如下内容:

var obj: C<P1> = C<P1>()

var obj = C<P2>()  // type is inferred

在您的班级C中,您仍然可以将T的任何用途视为符合MyProtocol。所以我认为这应该可以为您提供所需的一切,只要您记住泛型类的实例必须专用于单个特定的具体类型,而不是可以代表许多可能的具体类型的协议。

答案 1 :(得分:0)

您通常不需要为Swift变量声明类型。在大多数情况下,编译器可以推断类型。此外,对于泛型类,您应该让编译器弄清楚泛型类解析的内容:

class C<T: MyProtocol> {
    var value: T

    init (value: T) {
        self.value = value
    }
}

var obj = C(value: P1()) // type: C<P1>
// or:
var obj = C(value: P2()) // type: C<P2>