【问题标题】:Sequence extension that works on Arrays, Sets and Dictionaries in Swift适用于 Swift 中的数组、集合和字典的序列扩展
【发布时间】:2022-01-30 17:59:41
【问题描述】:

我正在跟随 Paul Hudson 的 Swift 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 { $0.isMultiple(of:2)}
        }
}

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

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

【问题讨论】:

  • 字典是一系列键值对。你想检查所有的键是偶数,还是所有的值都是偶数,或两者兼而有之?
  • 只有值,@Sweeper
  • @Swantewit 请注意,您将 allSatisfy 方法应用于 numbers 对象而不是序列本身
  • 你还没有真正理解保罗所说的。他专门谈论allSatisfy 和其他类似泛化的成员。

标签: swift protocols sequence


【解决方案1】:

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

extension Sequence where Element : BinaryInteger {
    var isAllEven : Bool {
        allSatisfy {$0.isMultiple(of: 2)}
    }
}

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

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

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

但这仅考虑String 键和Int

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

extension Dictionary where Value : BinaryInteger {
    var isAllEven : Bool {
        allSatisfy {$0.value.isMultiple(of: 2)}
    }
}

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多