适用于 Swift 中数组、集合和字典的序列扩展

Sequence extension that works on Arrays, Sets and Dictionaries in Swift

我正在学习 Swift Paul Hudson 的 100 天 Swift。在他的一个扩展课程中,我发现了一个概念,即更高级的开发人员可以编写一个 Sequence 扩展来为数组、集合和字典提供服务: https://www.hackingwithswift.com/quick-start/understanding-swift/when-are-protocol-extensions-useful-in-swift

我试过了,但是:

  1. 我不知道如何创建一个可以改变其类型的变量(想知道这是否可能)
  2. 我不知道如何创建一个也能为字典服务的序列,因为它们 allSatisfy 的语法有点不同

你能帮帮我吗? :)

代码:

extension Sequence {
        
        var isAllEven:Bool {
            numbers.allSatisfy { [=11=].isMultiple(of:2)}
        }
}

let numbers = Set([4, 8, 15, 16])
print(numbers.isAllEven)

我可以将数字更改为 Array 和 Set,但一旦我理解了 Paul 所说的内容,就有可能创建一个扩展,可以在一段代码中为所有 3 个提供服务,而无需更改变量内容.

由于 isMultiple(of:) 属于所有整数类型,通用版本 必须 被限制为 BinaryInteger

extension Sequence where Element : BinaryInteger {
    var isAllEven : Bool {
        allSatisfy {[=10=].isMultiple(of: 2)}
    }
}

但这不能涵盖Dictionary,因为Dictionary虽然符合Sequence,但Element类型不同。

您可以编写 Sequence 的第二个扩展,它匹配 Dictionary 元组类型

extension Sequence where Element == (key:String, value:Int) {
    var isAllEven : Bool {
        allSatisfy {[=11=].value.isMultiple(of:2)}
    }
}

但这仅考虑 String 键和 Int

更通用的方法是直接扩展 Dictionary

extension Dictionary where Value : BinaryInteger {
    var isAllEven : Bool {
        allSatisfy {[=12=].value.isMultiple(of: 2)}
    }
}