泛型 通用代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可以根据您定义的要求与任何类型一起使用。您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。 泛型是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)
答案 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)