overridefuncviewDidLoad() { super.viewDidLoad() self.navigationItem.title = "泛型" genericsMethod() // Do any additional setup after loading the view. }
overridefuncdidReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } funcgenericsMethod(){ println("----泛型----") //泛型是为了解决在针对不同数据类型,而做了同一种功能操作导致的每个类型都要写一份代码的问题。有了泛型,我们可以只写一份逻辑代码,而适应于不同的数据类型。 //泛型一阶段 var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, b: &anotherInt) println("someInt is now \(someInt),and anotherInt is now \(anotherInt)")
//泛型二阶段 var someIntTwo = 3 var anotherIntTwo = 107 swapTwoValues(&someInt, b: &anotherInt) var someString = "hello" var anotherString = "world" swapTwoValues(&someString, b: &anotherString) //泛型类型,Generic Types //除了通用的函数,swift使您能够定义自己的泛型类型。这些可以是定制类,结构,枚举,数组和字典等 var stackOfStrings = Stack<String>() stackOfStrings.push("uno") stackOfStrings.push("dos") stackOfStrings.push("tres") stackOfStrings.push("cuatro")
let fromTheTop = stackOfStrings.pop() //扩展一个泛型类型,Extending a Generic Type iflet topItem = stackOfStrings.topItem{ println("The top item on the stack is \(topItem).") } //类型约束 let strings = ["cat","dog","llama","parakeet","terrapin"] iflet foundIndex = findStringIndex(strings, valueToFind: "llama"){ println("The index of llama is \(foundIndex)") } let doubleIndex = findIndex([3.14159, 0.1, 0.25], valueToFind:9.3) let stringIndex = findIndex(["Mike","Malcolm","Andrea"], valueToFind:"Andrea") //where语句 // whereMethod() } /* func whereMethod(){ var stackOfStrings = Stack<String>() stackOfStrings.push("uno") stackOfStrings.push("dos") stackOfStrings.push("tres") var arrayOfStrings = ["uno","dos","tres"] if allItemsMatch(stackOfStrings, arrayOfStrings){ println("All items match.") }else{ println("Not all item match") } } */ //泛型一阶段 //交换2个数的值,The Problem That Generics Solve //inout作为函数声明时,引用传值的关键字 funcswapTwoInts(inout a: Int, inout b: Int){ let temporaryA = a //声明常量temporaryA 等于 a 的值 a = b //a 等于 b 的值 b = temporaryA//b 等于 a的常量值 } funcswapTwoStrings(inout a: String, inout b: String){ let temporaryA = a a = b b = temporaryA } funcswapTwoDoubles(inout a: Double, inout b: Double){ let temporaryA = a a = b b = temporaryA } //泛型二阶段 funcswapTwoValues<T> (inout a: T, inout b: T){ let temporaryA = a a = b b = temporaryA } //类型约束,Type Constraints funcfindStringIndex(array: [String], valueToFind: String) -> Int? { for (index, value) inenumerate(array){ if value == valueToFind{ return index } } returnnil } //if use //func findIndex <T> (array: [T], valueToFind: T) -> Int? { //Error:'T' is not convertible to 'MirrorDisposition' funcfindIndex <T: Equatable> (array: [T], valueToFind: T) -> Int? { for (index, value) inenumerate(array) { if value == valueToFind { return index } } returnnil } }
//C1,C2 是2个参数类型,他们都遵循Container约束 //C1的ItemType与C2的ItemType必须相同,并且C1的ItemType是遵循Equatable协议的。 //即C2的ItemType与C1的ItemType必须相同,所以这里不必单独写个C2的ItemType也符合Equatable funcallItemsMatch<C1: Container, C2: Container where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>(someContainer: C1, anotherContainer: C2) -> Bool{ if someContainer.count != anotherContainer.count{ returnfalse } //check each pair of items to see if they are equivalent for i in0..<someContainer.count{ if someContainer[i] != anotherContainer[i]{ returnfalse } } //all items match, so return true returntrue }