有没有办法在Swift中交换两个不同的对象

时间:2015-11-10 23:20:03

标签: swift swift2 swift2.1

我想知道是否有办法在swift中交换两个不同的对象。

这是我的试用版:

func swapXY<T>(inout first: T,intout second: T)
{
    (first ,second  ) = ( second,  first)
}

假设我希望这两个参数分别为T,Y。如何实现这一目标?

谢谢

4 个答案:

答案 0 :(得分:6)

是的,您可以交换两个项目,该功能已包含在标准库中。

swap(_:_:)

Exchange the values of a and b.
Declaration

func swap<T>(inout _ a: T, inout _ b: T)

Swift Standard Library Functions Reference

但是,如果它们不是同一类型,那么不,你不能交换两种不同类型的项目。

Swift 3

func swap<swapType>( _ a: inout swapType, _ b: inout swapType) {
  (a, b) = (b, a)
}

答案 1 :(得分:3)

你可以做的是从一个共同的祖先继承的更具体的类交换:

class Animal {}
class Dog: Animal {}
class Cat: Animal {}

// Note that cat and dog are both variables of type `Animal`, 
// even though their types are different subclasses of `Animal`.
var cat: Animal = Cat()
var dog: Animal = Dog()

print("cat: \(cat)")
print("dog: \(dog)")

swap(&dog, &cat) // use the standard Swift swap function.

print("After swap:")
print("cat: \(cat)")
print("dog: \(dog)")

上述代码有效,因为catdog在交换之前和之后都是“is-a”Animal。但是,交换不相关类型的对象不能在Swift中完成,也不是真的有意义:

var dog = Dog() // dog is of type Dog, NOT Animal
var cat = Cat() // cat is of type Cat, NOT Animal
swap(&cat, &dog) // Compile error!

此代码无法编译,因为Dog类型的变量在Swift或任何其他强类型语言中无法保存Cat类型的值。

答案 2 :(得分:1)

乍一看它看起来很可怕,第二眼看上去......它有时可能是非常有用的功能

import Foundation

let a: (Int, String) = (1,"alfa")
let b: (Bool, NSDate) = (true, NSDate())

func foo<A,B>(t: (A,B))->(B,A) {
    return (t.1,t.0)
}

print(a, foo(a))    // (1, "alfa") ("alfa", 1)
print(b, foo(b))    // (true, 2015-11-22 21:50:21 +0000) (2015-11-22 21:50:21 +0000, true)

答案 3 :(得分:1)

var a = 10
var b = 20 
print("A", a)
print("B",b)
a = a + b;//a=30 (10+20)
b = a - b;//b=10 (30-20)
a = a - b;//a=20 (30-10)
print("A",a)
print("B",b)