Swift 泛型和扩展需要锻炼

Swift generics and extensions need to workout

我目前正在学习 swift。在学习的过程中,我坚持使用泛型。我正在解决一个简单的问题 -> return 数组中指定元素的索引

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")

在这段代码中,我收到错误

Can not compare two operands using == operator which are of type T.

如果我们使用 T 以外的字母作为我们的通用标识符,您的问题的答案就会变得更清楚。

更改方法签名以使用字母 U。现在我们收到此错误消息:

Binary operator '==' cannot be applied to operands of type 'T' and 'U'

这是同样的错误,但使用不同的字母更清楚了。 Array 类型已经是泛型,它的泛型标识符是 T 类型。

当我们使用 U 时,它暴露了真正的问题。

Equatable 协议只要求我们的类型定义 == 来与自身进行比较。只要 U 的类型是 Equatable,我们就可以比较两个 U。但是 Equatable 协议并不能确保我们可以使用 ==.

来比较 UT

可以提供一些关于将 Equatable 协议与泛型一起使用的困难的见解。