Apple Swift:String类型的通用类型约束不起作用

时间:2014-11-25 00:12:21

标签: generics swift

很奇怪,但是下面的代码不起作用,我收到一条消息“从非协议继承,非类型'String'”。同样不能使用所有其他基本类型,如Int,Bool等。但它适用于Equatable类型。我无法理解的问题是什么。

import Cocoa
import Foundation

class Foo<T: String> {}

2 个答案:

答案 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是结构。