美文网首页
Swift 5.x 为泛型定义要求

Swift 5.x 为泛型定义要求

作者: ShenYj | 来源:发表于2020-07-11 10:08 被阅读0次
  • 如类型约束中描述的一样, 类型约束允许你在泛型函数或泛型类型相关的类型形式参数上定义要求.

  • 类型约束在为关联类型定义要求时也很有用.通过定义一个泛型Where子句来实现. 泛型Where子句让你能够要求一个关联类型必须遵循指定的协议, 或者指定的类型形式参数和关联类型必须相同. 泛型Where子句以Where关键字开头, 后面关联类型的约束或类型和关联类型一致的关系. 泛型Where子句写在一个类型或函数体的左半个大括号前面.

e.g.

protocol Container {
    associatedtype ItemType
    mutating func append(_ item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}
func allItemsMatch<C1: Container, C2: Container>(_ someContainer: C1, _ anotherContainer: C2) -> Bool where C1.ItemType == C2.ItemType, C1.ItemType: Equatable {
    
    // 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're equivalent.
    for i in 0..<someContainer.count {
        if someContainer[i] != anotherContainer[i] {
            return false
        }
    }
    
    return true
}

泛型类型限制部分
  • C1必须遵循Container协议(写作C1: Container)
  • C2也必须遵循Container协议(写作C2: Container)
  • C1的ItemType必须和C2的ItemType相同(写作 C1.ItemType == C2.ItemType)
  • C1的ItemType必须遵循Equatable协议(写作C1.ItemType: Equatable)
where子句部分
  • someContainer是一个C1类型的容器
  • anotherContainer是一个C2类型的容器
  • someContainer和anotherContainer中的元素类型相同
  • someContainer中的元素可以通过不等操作符(!=)检查它们是否不一样

带有泛型Where子句的扩展

  • 可以使用泛型的where子句来作为扩展的一部分.

e.g.

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

extension Stack where Element: Equatable {
    func isTop(_ item: Element) -> Bool {
        guard let topItem = items.last else {
            return false
        }
        return topItem == item
    }
}

e.g.

protocol Container {
    associatedtype ItemType
    mutating func append(_ item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

extension Container where ItemType == Double {
    func average() -> Double {
        var sum = 0.0
        for index in 0..<count {
            sum += self[index]
        }
        return sum / Double(count)
    }
}

相关文章

  • Swift 5.x 为泛型定义要求

    如类型约束中描述的一样, 类型约束允许你在泛型函数或泛型类型相关的类型形式参数上定义要求. 类型约束在为关联类型定...

  • Swift泛型

    泛型是 Swift 最强大的特性之一,oc转Swift的需要重点学习一下。① 泛型代码能根据所定义的要求写出可以用...

  • Swift和OC的区别

    Swift和OC的区别? 1、Swift没有地址和指针的概念 2、Swift对数据类型要求极为严谨 3、泛型,泛型...

  • 泛型(持续更新中......)

    一、泛型类和泛型接口 1.如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型。2.要求:...

  • Swift 泛型(Generics)

    泛型代码让你能根据你所定义的要求,写出可以用于任何类型的灵活的、可复用的函数。泛型是 Swift 最强大的特性之一...

  • Swift语法 -- [15 - 泛型]

    1.介绍 泛型代码让你能根据你所定义的要求写出可以用于任何类型的灵活的、可复用的函数,泛型是 Swift 最强大的...

  • Swift 5.x 泛型类型

    除了反省函数, Swift允许你定义自己的泛型类型. 它们是可以用于任意类型的自定义类、结构体、枚举, 和Arra...

  • Swift 5.x 泛型下标

    下标可以是泛型, 它们可以包含泛型where分句. 你可以在subscript后用尖括号来写类型占位符, 你还可以...

  • Swift学习:泛型

    本篇将详细总结介绍Swift泛型的用法;Swift泛型代码让你能够根据自定义的需求,编写出适用于任意类型、灵活可重...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

网友评论

      本文标题:Swift 5.x 为泛型定义要求

      本文链接:https://www.haomeiwen.com/subject/lqbvcktx.html