今天我正在阅读关于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)
有没有人对此有更好的理解,可以帮助我填补我的理解空白?谢谢。
答案 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
}
}