swift 易忽略的笔记 10):Generic

来源:互联网 发布:简单快递单打印软件 编辑:程序博客网 时间:2024/04/29 05:58

1. Generic Functions

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

var someInt = 3var anotherInt = 107swapTwoValues(&someInt, &anotherInt)// someInt is now 107, and anotherInt is now 3


2. Stack

struct Stack<T> {    var items = T[]()    mutating func push(item: T) {        items.append(item)    }    mutating func pop() -> T {        return items.removeLast()    }}

var stackOfStrings = Stack<String>()stackOfStrings.push("uno")stackOfStrings.push("dos")stackOfStrings.push("tres")stackOfStrings.push("cuatro")// the stack now contains 4 strings”

3. Type Constraints


func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {    for (index, value) in enumerate(array) {        if value == valueToFind {            return index        }    }    return nil}

let doubleIndex = findIndex([3.14159, 0.1, 0.25], 9.3)// doubleIndex is an optional Int with no value, because 9.3 is not in the arraylet stringIndex = findIndex(["Mike", "Malcolm", "Andrea"], "Andrea")// stringIndex is an optional Int containing a value of 2


4. Associated Types (for protocols)

protocol Container {    typealias ItemType    mutating func append(item: ItemType)    var count: Int { get }    subscript(i: Int) -> ItemType { get }}struct IntStack: Container {    // original IntStack implementation    var items = Int[]()    mutating func push(item: Int) {        items.append(item)    }    mutating func pop() -> Int {        return items.removeLast()    }    // conformance to the Container protocol    typealias ItemType = Int    mutating func append(item: Int) {        self.push(item)    }    var count: Int {    return items.count    }    subscript(i: Int) -> Int {        return items[i]    }}struct Stack<T>: Container {    // original Stack<T> implementation    var items = T[]()    mutating func push(item: T) {        items.append(item)    }    mutating func pop() -> T {        return items.removeLast()    }    // conformance to the Container protocol    mutating func append(item: T) {        self.push(item)    }    var count: Int {    return items.count    }    subscript(i: Int) -> T {        return items[i]    }}

4. Where Clause

func allItemsMatch<    C1: Container, C2: Container    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>    (someContainer: C1, anotherContainer: C2) -> Bool {                // check that both containers contain the same number of items        if someContainer.count != anotherContainer.count {            return false        }                // check each pair of items to see if they are equivalent        for i in 0..someContainer.count {            if someContainer[i] != anotherContainer[i] {                return false            }        }                // all items match, so return true        return true}


0 0
原创粉丝点击