我必须确定当前值是否等于给定的比较值。
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
}
但总是我有相同的结果二进制运算符无法应用....
答案 0 :(得分:2)
Equatable
并不完全意味着这一点。考虑一下等同的东西 - 例如Int
。 2 == 2
是有道理的。 2 == 3
将返回false
- 但它仍然有意义。现在,想一想其他的Equatable
- String
,例如。
"abc" == "abc" // true
"acb" == "abc" // false
那很好 - 但是这个怎么样:
"abc" == 4
Equatable
事物本身就是Equatable
- 而不是其他任何东西。在您的示例中,您要比较两种不同的类型 - TBaseValue, TComparingValue
。
答案 1 :(得分:1)
如果要比较任何值,可以使用重载:
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
}
因此,最合适的函数会自动调用。如果无法使用传递的参数调用第一个函数,则无论如何都会调用第二个函数。
答案 2 :(得分:0)
这适用于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
。
答案 3 :(得分:0)
为了比较两个泛型,您可以声明泛型,使得能够代替泛型类型的类型应符合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
}
这是如何运作的?
我们知道,遵守协议意味着在该协议中实现所有必需的方法。 可比较协议已将所有比较方法作为必需参数,任何实施可比较的类型都可以进行比较。
使用Generics进行快乐编码