0

我目前正在学习泛型函数的使用,并通过文档中的一些现有示例实现了它们解决的问题。

因此,我不断重复执行相同方案的函数,我可以这样使用泛型函数:

func swapTwoValues<T>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

但是如果我们想得更多,我们可以使用命令Any

func swapTwoStrings(inout a: Any, inout b: Any) {
    let temporaryA = a
    a = b
    b = temporaryA
}

那么,如果我们可以使用Any来完成这项工作,为什么还要使用泛型函数呢?

4

2 回答 2

1

使用generic functions这里 T 是一个类型。在你的代码中,这意味着 a 和 be 应该是相同的类型。

func swapTwoValues<T>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var a = 1
var b = 2
var c = "1"
var d = "2"
var e = 1
var f = "2"
swapTwoValues(&a, &b)//rihgt
swapTwoValues(&c, &d) //rihgt
swapTwoValues(&e, &f) //Wrong

使用any,你不知道a和b是否相同类型。**所以,如果你的函数很复杂,你必须动态检查类型。**并且当你使用这两个函数时也有一些区别

func swapTwoAny(inout a: Any, inout b: Any) {
    let temporaryA = a
    a = b
    b = temporaryA
}

那么例子1

  var a = 1
  var b = "2"
  swapTwoAny(&a, &b)//Wrong

示例 2

var a = 1 as Any
var b = "2" as Any
swapTwoAny(&a, &b) //Right.
于 2015-08-09T01:43:50.307 回答
0

如果您只是交换东西,则可能不需要在 Any 上使用泛型。但是,如果您实际上打算在参数上调用任何方法,则需要将它们强制转换为具有这些方法的类型(冗长,在运行时可能会失败,速度较慢),或者使用泛型参数。

于 2015-08-09T01:25:24.070 回答