繁体   English   中英

在Swift 2.0上比较两个通用对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM