Swift中的通用XOR交换

mik*_*ike 4 swap xor ios swift

今天我正在阅读有关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
Run Code Online (Sandbox Code Playgroud)

然后我尝试编写一个通用版本,但编译器抱怨"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)  
Run Code Online (Sandbox Code Playgroud)

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

rin*_*aro 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
Run Code Online (Sandbox Code Playgroud)
var a = NSStringCompareOptions.CaseInsensitiveSearch
var b = NSStringCompareOptions.BackwardsSearch

xorSwap(&a, &b)

a == .BackwardsSearch // -> true
b == .CaseInsensitiveSearch // -> true
Run Code Online (Sandbox Code Playgroud)