swift-泛型

689 阅读2分钟

系列内容,swift学习路上.

官方文档

  • 泛型代码使您能够编写灵活的、可重用的函数和类型,这些函数和类型可以根据您定义的需求使用任何类型。您可以编写避免重复的代码,并以清晰、抽象的方式表达其意图。

  • 泛型是Swift最强大的特性之一.

  • Swift 标准库是通过泛型代码构建出来的,其中数组和字典类型都是泛型集

  • 小结: 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型使用泛型代码,可以写出可重用的函数和数据结构.

示例

普通泛型函数

//交换函数
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

带类型约束函数

1.普通参数约束

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    
}

2.带where子句约束

func allItemsMatch<C1: Container, C2: Container>
    (_ someContainer: C1, _ anotherContainer: C2) -> Bool
    where C1.Item == C2.Item, C1.Item: Equatable {
}

关联类型

在定义协议时,声明一个或多个关联类型作为协议定义的一部分有时很有用。关联类型为用作协议一部分的类型提供占位符名称。在采用协议之前,不会指定关联类型的实际类型。关联类型是用associatedtype关键字指定的。

  • 在协议Container中使用关联类型Item,关键字associatedtype修饰.
  • 结构体Stack实现协议,typealias Item = Element,由于类型推断可省略.
//关联类型
protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(i: Int) -> Item { get }
}

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

书籍

1.亲读,诸多不甚理解,待续