很奇怪,但是下面的代码不起作用,我收到一条消息“从非协议继承,非类型'String'”。同样不能使用所有其他基本类型,如Int,Bool等。但它适用于Equatable类型。我无法理解的问题是什么。
import Cocoa
import Foundation
class Foo<T: String> {}
答案 0 :(得分:2)
泛型的观点是允许我们的类具有多种不同的类型。我们可以指定我们的通用具有一些特定的方面。
例如,如果我们想要相等的对象,我们将在声明泛型时指定它:
class Foo<T: Equatable> {
}
或许我们想要类Bar
或其子类之一的对象:
class Foo<T: Bar> {
}
使用类执行此操作的优势是我们仍然可以区分Foo<ParentClass>
和Foo<ChildClass>
的实例。如果我们没有使用泛型,并指定我们的ParentClass
类型的实例变量,继承将允许我们仍然为它分配ChildClass
的对象,但我们不能够比较Foo
的对象以确定它是什么类型的Foo
,除非我们使用泛型。考虑一个类型[ParentClass]
的数组,它可以容纳ParentClass
或其子类,而不是[ChildClass]
类型的数组,它不能保存ParentClass
类型的对象。
现在,回到你的Foo<T: String>
问题,这里的问题是String
是一个结构。它不是一个可以继承的类,它不是其他事物可以遵循的协议。它是一个结构。 Foo
唯一可以是Foo<String>
的类型,因为其他任何内容都不是String
。因此Foo<T: String>
是不允许的,因为它只会令人困惑。
将此与Foo<T: Equatable>
的第一个示例进行比较,因为事情可以符合Equatable
,我可以实例化多种类型的Foo
:
let i = Foo<Int>()
let d = Foo<Double>()
let s = Foo<String>()
let c = Foo<Character>()
但如果允许Foo<T: String>
,我唯一可以实例化的是:
let s = Foo<String>()
我永远无法实例化任何其他类型的Foo
,那么重点是什么?
答案 1 :(得分:0)
您获得的错误是因为您无法从结构继承而String是结构。