我想知道是否有办法快速交换两个不同的对象。
这是我的试验:
func swapXY<T>(inout first: T,intout second: T)
{
(first ,second ) = ( second, first)
}
假设我希望这两个参数分别为 T,Y。如何实现?
谢谢
是的,您可以交换两个项目,并且该功能已包含在标准库中。
swap(_:_:)
Exchange the values of a and b.
Declaration
func swap<T>(inout _ a: T, inout _ b: T)
但是,如果它们不是同一类型,那么不,您不能交换不同类型的两个项目。
斯威夫特 3
func swap<swapType>( _ a: inout swapType, _ b: inout swapType) {
(a, b) = (b, a)
}
您可以做的是从共同祖先继承的更具体的类交换:
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
不能保存Cat
Swift 或任何其他强类型语言中的类型值。
乍一看它看起来很糟糕,第二眼看起来……它有时可能是非常有用的功能
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)
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)