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

Posted

技术标签:

【中文标题】Apple Swift:String 类型的泛型类型约束仅不起作用【英文标题】:Apple Swift: Generic type constraint for String type only not works 【发布时间】:2014-11-25 00:12:21 【问题描述】:

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

import Cocoa
import Foundation

class Foo<T: String> 

【问题讨论】:

您的 Model-T 可以选择任何颜色,只要它是黑色的。 【参考方案1】:

泛型的意义在于允许我们的类具有多种不同的类型。我们可以指定我们的泛型有一些特定的方面。

例如,如果我们想要相等的对象,我们将在声明我们的泛型时指定:

class Foo<T: Equatable> 


或者也许我们想要属于 Bar 类或其子类之一的对象:

class Foo<T: Bar> 


使用类这样做的好处是我们仍然可以区分Foo&lt;ParentClass&gt;Foo&lt;ChildClass&gt; 的实例。如果我们不使用泛型,并指定类型为ParentClass 的实例变量,继承将允许我们仍将ChildClass 的对象分配给它,但我们将无法比较Foo 的对象来确定Foo 是什么类型,除非我们使用泛型。考虑一个[ParentClass] 类型的数组,它可以保存ParentClass 或其子类,而一个[ChildClass] 类型的数组,它不能保存ParentClass 类型的对象。


现在,回到Foo&lt;T: String&gt; 的问题,这里的问题是String 是一个结构。它不是可以继承的类,也不是其他东西可以遵循的协议。这是一个结构。 Foo 的唯一类型是 Foo&lt;String&gt;,因为没有其他类型是 String。因此,Foo&lt;T: String&gt; 是不允许的,因为它只会令人困惑。

将此与Foo&lt;T: Equatable&gt; 的第一个示例进行比较,因为事物可以符合Equatable,所以我可以实例化多种类型的Foo

let i = Foo<Int>()
let d = Foo<Double>()
let s = Foo<String>()
let c = Foo<Character>()

但如果Foo&lt;T: String&gt; 被允许,我唯一能实例化的是:

let s = Foo<String>()

而且我永远无法实例化任何其他类型的Foo,那有什么意义呢?

【讨论】:

【参考方案2】:

你得到的错误是因为你不能从结构继承,而 String 是一个结构。

【讨论】:

以上是关于Apple Swift:String 类型的泛型类型约束仅不起作用的主要内容,如果未能解决你的问题,请参考以下文章

仅适用于数值类型的泛型类型约束

java如何获得泛型中的类

只能采用某些类型的泛型类

如何获取java泛型的参数类型

在 Typescript 的泛型类中初始化泛型类型

JAVA中的泛型类是啥东西?