适用于 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
我试过了,但是:
- 我不知道如何创建一个可以改变其类型的变量(想知道这是否可能)
- 我不知道如何创建一个也能为字典服务的序列,因为它们
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)}
}
}
我正在学习 Swift Paul Hudson 的 100 天 Swift。在他的一个扩展课程中,我发现了一个概念,即更高级的开发人员可以编写一个 Sequence
扩展来为数组、集合和字典提供服务:
https://www.hackingwithswift.com/quick-start/understanding-swift/when-are-protocol-extensions-useful-in-swift
我试过了,但是:
- 我不知道如何创建一个可以改变其类型的变量(想知道这是否可能)
- 我不知道如何创建一个也能为字典服务的序列,因为它们
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)}
}
}