使用Any代替泛型

时间:2019-02-10 08:29:45

标签: swift generics

  

泛型   通用代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可以根据您定义的要求与任何类型一起使用。您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。    泛型是Swift最强大的功能之一,许多Swift标准库都是使用泛型代码构建的。实际上,即使您没有意识到,您在整个《语言指南》中都使用了泛型。例如,Swift的Array和Dictionary类型都是通用集合。您可以创建一个包含Int值的数组,或者一个包含String值的数组,或者实际上是可以在Swift中创建的任何其他类型的数组。同样,您可以创建一个字典来存储任何指定类型的值,并且对该类型可以没有任何限制。   泛型解决的问题   这是一个标准的非通用函数,称为swapTwoInts( :),该函数交换两个Int值:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
   let temporaryA = a
   a = b
   b = temporaryA
}
  

此函数利用输入/输出参数交换a的值   和b,如输入输出参数中所述。

     

swapTwoInts( :)函数将b的原始值交换为a,   并将a的原始值转换为b。您可以调用此函数进行交换   两个Int变量中的值:

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
  

//打印“ someInt现在为107,anotherInt现在为3”   swapTwoInts( :)函数很有用,但只能与Int一起使用   价值观。如果要交换两个String值或两个Double值,   您必须编写更多函数,例如swapTwoStrings( :)和   swapTwoDoubles( :)函数如下所示:

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

func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

我的问题:

我们可以只使用Any类型作为参数类型,而不是使用泛型函数

func swapTwoInts(_a:inout Any,_b:inout Int){
   let temporaryA = a
   a = b
   b = temporaryA
}

那么如何迅速发挥重要作用?

我可以在没有这种泛型的情况下编写代码

var num = 3
var numtwo = 5

print(num)
print(numtwo)

func swap(_ a: inout Any, _ b: inout Any){
   let tempA=a
   a=b
   b=tempA
}

swap(a: &num, b: &numtwo) 

1 个答案:

答案 0 :(得分:4)

迅速地,如果变量的类型与该值相同,则可以为该变量分配值。想象一下你有这个:

var a = 1
var b = 2

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

swapTwoValues(&a, &b) // <- Cannot pass immutable value as inout argument: implicit conversion from 'Int' to 'Any' requires a temporary

因此,编译器会强制您隐式地为变量类型分配任何。我想这不是您想要的。因此,您必须告诉编译器,参数的类型无关紧要。唯一重要的是它们都具有相同类型,可以满足编译器的需要。因此,可以使用通用或某种协议

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

swapTwoValues(&a, &b) // Done

提示:您可以在单行代码中用元组交换值,而无需使用临时变量,例如:(即使没有函数和泛型等)

(a, b) = (b, a)