5

我想知道是否有办法快速交换两个不同的对象。

这是我的试验:

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

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

谢谢

4

4 回答 4

10

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

swap(_:_:)

Exchange the values of a and b.
Declaration

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

Swift 标准库函数参考

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

斯威夫特 3

func swap<swapType>( _ a: inout swapType, _ b: inout swapType) {
  (a, b) = (b, a)
}
于 2015-11-10T23:33:12.197 回答
6

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

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)")

上面的代码之所以有效,是因为cat在交换之前和之后dog都是 "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不能保存CatSwift 或任何其他强类型语言中的类型值。

于 2015-11-11T00:17:16.407 回答
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)
于 2015-11-22T21:52:44.067 回答
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)
于 2020-04-26T13:02:39.093 回答