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

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

提问人:Swantewit 提问时间:1/30/2022 最后编辑:AsperiSwantewit 更新时间:1/30/2022 访问量:138

问:

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

我已经试过了,但是:

  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 个提供服务,而无需更改变量内容。

SWIFT 协议 序列

评论

1赞 Sweeper 1/30/2022
字典是键值对的序列。您想检查所有键是偶数,还是所有值都是偶数,还是两者兼而有之?
0赞 Swantewit 1/30/2022
只有值,@Sweeper
0赞 Leo Dabus 1/30/2022
@Swantewit 请注意,您正在将 allSatisfy 方法应用于 numbers 对象,而不是序列本身
0赞 1/30/2022
你还没有真正理解保罗所说的话。他特别谈到了和其他类似的广义成员。allSatisfy

答:

2赞 vadian 1/30/2022 #1

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

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

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

您可以编写与元组类型匹配的第二个扩展SequenceDictionary

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

但这只考虑键和值StringInt

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

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