[英]compare two generic objects on swift 2.0
我必须确定当前值是否等于给定的比较值。
public static func Is<TBaseValue, TComparingValue>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
return baseValue == comparingValue
}
我几乎尝试了
public static func Is<TBaseValue: Comparable, TComparingValue: Comparable>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
return baseValue==comparingValue
}
和这个
public static func Is<TBaseValue: Equatable, TComparingValue: Equatable>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
return baseValue == comparingValue
}
但总是有相同的结果Binary运算符无法应用...
Equatable
并不完全意味着这一点。 考虑一下相等的东西-例如Int
。 2 == 2
有意义。 2 == 3
将返回false
但仍然有意义。 现在,考虑一下其他的Equatable
- String
。
"abc" == "abc" // true
"acb" == "abc" // false
很好-但是呢:
"abc" == 4
Equatable
东西对自己是Equatable
,而不是其他一切。 在您的示例中,您正在比较两种不同的类型TBaseValue, TComparingValue
。
如果要比较任何值,可以使用重载:
static func Is<T: Equatable>(first: T, second: T) -> Bool {
return first == second
}
static func Is<T1, T2>(first: T1, second: T2) -> Bool {
return false
}
因此,最合适的功能会自动被调用。 如果无法使用传递的参数调用第一个函数,则无论如何都要调用第二个函数。
这适用于Swift 2.0。
func Is<Any : Equatable>(l: Any, _ r: Any) -> Bool {
return l == r
}
Is("a", "a") // true
Is("a", "b") // false
Is(1, 1) // true
它也可以与AnyObject
一起AnyObject
。
为了比较两个泛型,可以声明泛型,使得能够代替您的泛型类型的类型应符合Comparable协议。
struct Heap<T: Comparable>{
var heap = [T]()
mutating func insert(element: T){
heap.append(element)
var index = heap.count - 1
heapify(childIndex: index)
}}
现在我们将能够:
if heap[parentIndex] < heap[childIndex] {
//Your code
}
如何运作?
众所周知,遵守协议意味着在该协议中实现所有必需的方法。 可比协议已将所有比较方法作为必需参数,任何实现可比的类型都可以进行比较。
使用泛型进行快乐编码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.