gpt4 book ai didi

generics - 苹果 swift : Generic type constraint for String type only not works

转载 作者:行者123 更新时间:2023-11-28 05:32:38 25 4
gpt4 key购买 nike

很奇怪,但是下面的代码不起作用,我收到一条消息“从非协议(protocol)、非类类型‘String’继承”。也不适用于所有其他基本类型,例如 Int、Bool 等。但它适用于 Equatable 类型。什么问题我不明白。

import Cocoa
import Foundation

class Foo<T: String> {}

最佳答案

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

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

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是一个结构。它不是可以继承的类,也不是其他东西可以遵守的协议(protocol)。这是一个结构。唯一类型 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 ,那有什么意义呢?

关于generics - 苹果 swift : Generic type constraint for String type only not works,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com