Swift中的通用XOR交换

时间:2014-11-04 16:13:00

标签: ios swift swap xor

今天我正在阅读关于XOR Swaps的内容,并且我想我会尝试在Swift中实现一个能够做到这一点的函数。我成功写了这个函数的非泛型版本:

import UIKit

func xorSwap (inout x: Int, inout y: Int) {
    if x != y {
        x ^= y
        y ^= x
        x ^= y
    }
}


var a = 10
var b = 20

xorSwap(&a, &b)

println(a) //=> 20
println(b) //=> 10

然后我尝试编写这个的通用版本,但编译器抱怨说' T与Bool'不完全相同。我假设我需要声明符合性的另一个协议,但我不确定那是什么。这是对通用版本的尝试:

import UIKit

func xorSwap<T: Equatable> (inout x: T, inout y: T) {
    if x != y {
        x ^= y
        y ^= x
        x ^= y
    }
}


var a = 10
var b = 20

xorSwap(&a, &b)

println(a)
println(b)  

有没有人对此有更好的理解,可以帮助我填补我的理解空白?谢谢。

2 个答案:

答案 0 :(得分:5)

您可以使用内置BitwiseOperationsType

func xorSwap<T: protocol<BitwiseOperationsType, Equatable>> (inout x: T, inout y: T) {
    if x != y {
        x ^= y
        y ^= x
        x ^= y
    }
}

var a = 10
var b = 20

xorSwap(&a, &b)

println(a) // -> 20
println(b) // -> 10

var a = NSStringCompareOptions.CaseInsensitiveSearch
var b = NSStringCompareOptions.BackwardsSearch

xorSwap(&a, &b)

a == .BackwardsSearch // -> true
b == .CaseInsensitiveSearch // -> true

答案 1 :(得分:0)

您的函数对其参数执行两种操作:!=和xor。

您指定的类型限制仅保证T必须Equatable隐含地为您提供!=

您必须添加一个保证xor:

的约束
// protocol that guarantees ^ operator
protocol Xorable {
    func ^(lhs: Self, rhs: Self) -> Self
}

// declare Int to support xor
extension Int : Xorable {}

// Your slightly modified function that depends on xor and Equatable
func xorSwap<T : protocol<Xorable, Equatable>> (inout x: T, inout y: T) {
    if x != y {
        x = x ^ y
        y = y ^ x
        x = x ^ y
    }
}