gpt4 book ai didi

swift : Custom operator to update dictionary value

转载 作者:搜寻专家 更新时间:2023-11-01 07:32:27 24 4
gpt4 key购买 nike

是否有一种优雅的方法来制作更新字典值的自定义运算符?

更具体地说,我想要一个前缀运算符来递增与给定键对应的整数值:

prefix operator +> {}

prefix func +> //Signature
{
...
}

var d = ["first" : 10 , "second" : 33]
+>d["second"] // should update d to ["first" : 10 , "second" : 34]

使用函数式的方式是可行的。例如,要计算数组中元素的频率:

func update<K,V>(var dictionary: [K:V], key: K, value: V) -> [K:V] {
dictionary[key] = value
return dictionary
}

func increment<T>(dictionary: [T:Int], key: T) -> [T:Int] {
return update(dictionary, key: key, value: dictionary[key].map{$0 + 1} ?? 1)
}

func histogram<T>( s: [T]) -> [T:Int] {
return s.reduce([T:Int](), combine: increment)
}

let foo = histogram([1,4,3,1,4,1,1,2,3]) // [2: 1, 3: 2, 1: 4, 4: 2]

但我正在尝试使用自定义运算符做同样的事情

最佳答案

var d = ["first" : 10 , "second" : 33]

d["second"]?++

运算符可以这样实现:

prefix operator +> {}
prefix func +> <I : ForwardIndexType>(inout i: I?) {
i?._successorInPlace()
}

var dict = ["a":1, "b":2]

+>dict["b"]

dict // ["b": 3, "a": 1]

虽然我不确定它如何为您提供频率函数 - 我的意思是,如果它正在构建字典,它不会有任何键开始,所以不会有任何递增。不过, 有很多很酷的方法可以做到这一点。使用后缀 ++,您可以这样做:

extension SequenceType where Generator.Element : Hashable {
func frequencies() -> [Generator.Element:Int] {
var result: [Generator.Element:Int] = [:]
for element in self {
result[element]?++ ?? {result.updateValue(1, forKey: element)}()
}
return result
}
}

Airspeed Velocity tweeted another cool way :

extension Dictionary {
subscript(key: Key, or or: Value) -> Value {
get { return self[key] ?? or }
set { self[key] = newValue }
}
}

extension SequenceType where Generator.Element : Hashable {
func frequencies() -> [Generator.Element:Int] {
var result: [Generator.Element:Int] = [:]
for element in self { ++result[element, or: 0] }
return result
}
}

或者,使用未记录的函数:

extension SequenceType where Generator.Element : Hashable {
func frequencies() -> [Generator.Element:Int] {
var result: [Generator.Element:Int] = [:]
for el in self {result[el]?._successorInPlace() ?? {result[el] = 1}()}
return result
}
}

关于 swift : Custom operator to update dictionary value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31731272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com