提问人:Swantewit 提问时间:1/30/2022 最后编辑:AsperiSwantewit 更新时间:1/30/2022 访问量:138
适用于 Swift 数组、集合和字典的序列扩展
Sequence extension that works on Arrays, Sets and Dictionaries in Swift
问:
我正在通过 Paul Hudson 的 100 days of Swift 学习 Swift。在他的一堂扩展课中,我发现了一个概念,即更高级的开发人员可以编写一个扩展来服务数组、集合和字典:https://www.hackingwithswift.com/quick-start/understanding-swift/when-are-protocol-extensions-useful-in-swiftSequence
我已经试过了,但是:
- 我不知道如何创建一个可以改变其类型的变量(想知道这是否可能)
- 我不知道如何创建一个也可以为字典提供服务的序列,因为它们的语法有点不同
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 个提供服务,而无需更改变量内容。
答:
2赞
vadian
1/30/2022
#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)}
}
}
评论
allSatisfy