Ios Swift 2.0中的泛型

Ios Swift 2.0中的泛型,ios,swift,generics,swift2,Ios,Swift,Generics,Swift2,我已经阅读了苹果开发者网站上的Swift教程,但我不理解泛型的概念。有人能用一种简单的方式来解释吗?例如: func swapTwoValues<T>(inout a: T, inout b: T) { let temporaryA = a a = b b = temporaryA } func swapTwoValues(inout a: Int, inout b: Int) { let temp = a a = b b = tem

我已经阅读了苹果开发者网站上的Swift教程,但我不理解泛型的概念。有人能用一种简单的方式来解释吗?例如:

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

func swapTwoValues(inout a: String, inout b: String) {
    let temp = a
    a = b
    b = temp
} 

// Many more swapTwoValues functions...
func swaptwo值(inout a:T,inout b:T){
设临时a=a
a=b
b=暂时性
}

本质上,它只是意味着它不是特定于类型的。使用
T
只需编写一个函数,而不是为每种类型
Int
Double
Float
String
等编写多个函数。

如果在您给出的示例中不使用泛型,则必须为要交换的每种类型重载
交换值。例如:

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

func swapTwoValues(inout a: String, inout b: String) {
    let temp = a
    a = b
    b = temp
} 

// Many more swapTwoValues functions...
上述函数之间唯一不同的是它们接受的类型;其中的代码完全相同。因此,最好编写一个可以采用任何类型的泛型函数


重要的是要注意,您不能用
任何
替换
t
。不能保证
a
b
是相同的类型-例如,您不能交换
Int
字符串

在您的示例中,t代表一种类型。一旦设置,该类型对于整个函数是一致的

func swapTwoValues<T>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
例如,我们不能将字符串替换为Int,甚至不能将Int替换为Double,但只要类型相同,那么此泛型方法将采用任何类型,因为它在所有其他方面都不受限制

var valueA = "Hello"
var valueB = "Swift"
swapTwoValues(&valueA, b: &valueB)

valueA // "Swift"
valueB // "Hello"
但是,这并不意味着泛型函数中排除了多种类型。您只需指定一个不同的字母来表示不同的类型(使用的字母是无关的,T只是因为它是类型的第一个字母,但没有理由不能用Q或任何其他字母替换):

或者使用
=
检查第二种类型是否与集合中的元素类型等效:

func swapTwoValues<T: CollectionType, S where S == T.Generator.Element>(inout a: T, inout b: T, inout c: S, inout d: S) {
    let temporaryA = a
    a = b
    b = temporaryA

    let temporaryC = c
    c =  d
    d = temporaryC
}
func swaptwo值(inout a:T、inout b:T、inout c:S、inout d:S){
设临时a=a
a=b
b=暂时性
设时间c=c
c=d
d=临时性
}

进一步阅读:事情变得更有趣了,因为现在泛型函数可以具有类型方法的特性,这使得它们更容易发现。< /P>伟大的问题,如果你满足你的问题,你应该考虑选择这个问题的答案。这将提高您的帖子质量,从而使社区受益。

func swapTwoValues<T: CollectionType where T.Generator.Element: UnsignedIntegerType>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var valueA:[UInt] = [10,12,4]
var valueB:[UInt] = [11,45,67]

swapTwoValues(&valueA, b: &valueB)

valueA  // [11, 45, 67]
valueB // [10, 12, 4]
func swapTwoValues<T: CollectionType, S where S == T.Generator.Element>(inout a: T, inout b: T, inout c: S, inout d: S) {
    let temporaryA = a
    a = b
    b = temporaryA

    let temporaryC = c
    c =  d
    d = temporaryC
}