Swift泛型和扩展需要锻炼

时间:2015-06-25 12:02:17

标签: swift generics protocols

我正在学习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的<=运算符比较两个操作数。

1 个答案:

答案 0 :(得分:4)

如果我们使用T以外的字母作为通用标识符,则问题的答案会变得更加明确。

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

enter image description here

  

二元运算符'=='不能应用于'T'和'U'类型的操作数

这是同样的错误,但通过使用不同的字母可以更清楚。 Array类型已经是通用的,其通用标识符为其类型T

当我们使用U时,它会解析真正的问题。

Equatable协议只要求我们的类型定义==以便与自身进行比较。只要U的类型为U,我们就可以比较两个Equatable。但Equatable协议无法确保我们可以使用UT==进行比较。

This Stack Overflow answer可以提供一些有关将Equatable协议与泛型使用的困难的见解。