我正在学习swift。在学习的过程中,我坚持使用泛型。我正在解决一个简单的问题 - >返回数组中指定元素的索引
import UIKit
extension Array
{
func indexOfLetter<T:Equatable>(item:T) -> Int
{
var i = 0
for (index, value) in enumerate(self)
{
if value == item
{
return i
}
i++
}
return -1;
}
}
var arrayOfItems = ["A","B"]
arrayOfItems.indexOfLetter("A")
在这段代码中,我收到的错误是
无法使用类型为T的<=运算符比较两个操作数。
答案 0 :(得分:4)
如果我们使用T
以外的字母作为通用标识符,则问题的答案会变得更加明确。
更改方法签名以使用字母U
。现在我们收到此错误消息:
二元运算符'=='不能应用于'T'和'U'类型的操作数
这是同样的错误,但通过使用不同的字母可以更清楚。 Array
类型已经是通用的,其通用标识符为其类型T
。
当我们使用U
时,它会解析真正的问题。
Equatable
协议只要求我们的类型定义==
以便与自身进行比较。只要U
的类型为U
,我们就可以比较两个Equatable
。但Equatable
协议无法确保我们可以使用U
将T
与==
进行比较。
This Stack Overflow answer可以提供一些有关将Equatable
协议与泛型使用的困难的见解。