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

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

import Cocoa
import Foundation

class Foo<T: String> {}

【问题讨论】:

  • 您的 Model-T 可以选择任何颜色,只要它是黑色的。

标签: generics swift


【解决方案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 是一个结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多