协议作为 Set 的泛型参数

本文最后更新于 2021年4月4日 晚上

协议作为 Swift 中的哈希表(Set)的泛型类型, 一直都是很困惑的一个问题, 这里找到了两种方式来设置协议类型作为 Set 的泛型参数…

很早之前就想探究这个问题了, 实际上看到解决方法有两种.

  • 第一种是使用 AnyHashable 作为 Set 的泛型参数, 然后往里面添加 Hashable 类型:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

    var vcSet: Set<AnyHashable> = []

    let p1 = People(name: "er", age: 1, isAlive: true)
    let d1 = Dog(color: "green", length: 22.3, isAlive: true)
    print(vcSet.insert(p1))
    print(vcSet.insert(d1))


    protocol Animal: Hashable {
    var isAlive: Bool { get }
    }

    struct People: Animal {
    var name: String
    var age: Int
    var isAlive: Bool
    }

    struct Dog: Animal {
    var color: String
    var length: Double
    var isAlive: Bool
    }
  • 另外一种是使用泛型包装类来建立 Set:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    protocol testProtocol: Hashable {
    // 协议内容
    }

    class test<Elem: testProtocol> {
    var s : Set<Elem>?

    // ...
    }

协议作为 Set 的泛型参数
https://blog.rayy.top/2018/09/09/2019-SetOfProtocol/
作者
貘鸣
发布于
2018年9月9日
许可协议