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
协议并不能确保我们可以使用 ==
.
来比较 U
和 T
可以提供一些关于将 Equatable
协议与泛型一起使用的困难的见解。
我目前正在学习 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
协议并不能确保我们可以使用 ==
.
U
和 T
Equatable
协议与泛型一起使用的困难的见解。