Ios Swift中的一般异或交换

Ios Swift中的一般异或交换,ios,swift,swap,xor,Ios,Swift,Swap,Xor,今天我在读关于XOR交换的书,我想我会尝试在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) //=

今天我在读关于XOR交换的书,我想我会尝试在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)  
导入UIKit
func xorSwap(inout x:T,inout y:T){
如果x!=y{
x^=y
y^=x
x^=y
}
}
变量a=10
var b=20
xorSwap(&a和&b)
println(a)
println(b)

是否有人对此有更好的理解,并能帮助我填补理解上的空白?谢谢

函数对其参数执行两种操作:
=和异或

您指定的类型约束仅保证
T
必须是
equalable
,这会隐式地为您提供
=

您必须添加一个保证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
    }
}
//保证^operator的协议
协议可交换{
func^(左:Self,右:Self)->Self
}
//声明Int以支持xor
扩展名Int:Xorable{}
//您的函数稍有修改,它依赖于xor和Equatable
func xorSwap(inout x:T,inout y:T){
如果x!=y{
x=x^y
y=y^x
x=x^y
}
}

您可以使用内置的
位操作类型

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

哦,是的,我应该澄清这只是一种好奇。我看不到自己在任何地方使用过这个,但我的好奇心越来越强。啊,这让我松了一口气看一看。这里也可以应用相同的解决方案。我知道您这样做只是出于好奇,但请注意Swift有一个。如果参数是
浮动
,会发生什么?这有意义吗?任何
equalable
?另一种语法是func xorSwap(inout x:T,inout y:T),这就是我要找的。谢谢关于语法有一个问题:协议是否声明类型必须同时符合BitwiseOperationsType和Equalable?我假设你可以用逗号分隔协议,但是编译器不喜欢这样,它被称为“协议组合”,参见:真棒。回答得好!谢谢@rintaro
var a = NSStringCompareOptions.CaseInsensitiveSearch
var b = NSStringCompareOptions.BackwardsSearch

xorSwap(&a, &b)

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