下面是一个标准的非泛型函数 swapTwoInts(_:_:)
,用来交换两个 Int
值:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
这个函数使用输入输出参数(inout
)来交换 a
和 b
的值,具体请参考 输入输出参数。
swapTwoInts(_:_:)
函数将 b
的原始值换成了 a
,将 a
的原始值换成了 b
,你可以调用这个函数来交换两个 Int
类型变量:
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// 打印“someInt is now 107, and anotherInt is now 3”
swapTwoInts(_:_:)
函数很实用,但它只能作用于 Int
类型。如果你想交换两个 String
类型值,或者 Double
类型值,你必须编写对应的函数,类似下面 swapTwoStrings(_:_:)
和 swapTwoDoubles(_:_:)
函数:
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
你可能注意到了,swapTwoInts(_:_:)
、swapTwoStrings(_:_:)
和 swapTwoDoubles(_:_:)
函数体是一样的,唯一的区别是它们接受的参数类型(Int
、String
和 Double
)。
在实际应用中,通常需要一个更实用更灵活的函数来交换两个任意类型的值,幸运的是,泛型代码帮你解决了这种问题。(这些函数的泛型版本已经在下面定义好了。)
注意
在上面三个函数中,
a
和b
类型必须相同。如果a
和b
类型不同,那它们俩就不能互换值。Swift 是类型安全的语言,所以它不允许一个String
类型的变量和一个Double
类型的变量互换值。试图这样做将导致编译错误。