我想知道是否有办法在swift中交换两个不同的对象。
这是我的试用版:
func swapXY<T>(inout first: T,intout second: T)
{
(first ,second ) = ( second, first)
}
假设我希望这两个参数分别为T,Y。如何实现这一目标?
谢谢
答案 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)")
上述代码有效,因为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
类型的变量在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)