Ios Swift 2.0中的泛型
我已经阅读了苹果开发者网站上的Swift教程,但我不理解泛型的概念。有人能用一种简单的方式来解释吗?例如: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
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
}