Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清晰地拆分和重新组合Swift Publisher值?(使用OpenCombine) 我有一个上游发布者发布值。例如,十六进制颜色流 另外,我有一个操作符,由发布者支持,它接收这些值并输出一些长期一对一的派生值,但需要有关前后值的信息。例如,返回每个十六进制颜色与其之前颜色之间的差异我无法修改此项。 我想用一种简单的方法将这两个值一起返回。例如,一个元组(颜色,不同的前一种颜色) 我使用OpenCombine实现向后兼容性,它可能缺少一些操作符。例如,它没有邮政编码(如果我需要的话)_Swift_Combine - Fatal编程技术网

如何清晰地拆分和重新组合Swift Publisher值?(使用OpenCombine) 我有一个上游发布者发布值。例如,十六进制颜色流 另外,我有一个操作符,由发布者支持,它接收这些值并输出一些长期一对一的派生值,但需要有关前后值的信息。例如,返回每个十六进制颜色与其之前颜色之间的差异我无法修改此项。 我想用一种简单的方法将这两个值一起返回。例如,一个元组(颜色,不同的前一种颜色) 我使用OpenCombine实现向后兼容性,它可能缺少一些操作符。例如,它没有邮政编码(如果我需要的话)

如何清晰地拆分和重新组合Swift Publisher值?(使用OpenCombine) 我有一个上游发布者发布值。例如,十六进制颜色流 另外,我有一个操作符,由发布者支持,它接收这些值并输出一些长期一对一的派生值,但需要有关前后值的信息。例如,返回每个十六进制颜色与其之前颜色之间的差异我无法修改此项。 我想用一种简单的方法将这两个值一起返回。例如,一个元组(颜色,不同的前一种颜色) 我使用OpenCombine实现向后兼容性,它可能缺少一些操作符。例如,它没有邮政编码(如果我需要的话),swift,combine,Swift,Combine,伪代码: //不能搞乱这个。基本上只是返回连续的差异 扩展发布程序{ func colorDiff()->AnyPublisher,其中Color==输出,E==失败{ 回归自我 .map({($0,$0)}) .scan((Color.black(),Color.black()){ let(u,prev)=0美元 let(curr,_)=1美元 返回(上一个,当前) }) .地图({ let(上、当前)=0美元 返回货币-上一个 }) .删除任何发布者() } } 让colorPublishe

伪代码:

//不能搞乱这个。基本上只是返回连续的差异
扩展发布程序{
func colorDiff()->AnyPublisher,其中Color==输出,E==失败{
回归自我
.map({($0,$0)})
.scan((Color.black(),Color.black()){
let(u,prev)=0美元
let(curr,_)=1美元
返回(上一个,当前)
})
.地图({
let(上、当前)=0美元
返回货币-上一个
})
.删除任何发布者()
}
}
让colorPublisher=…//发射#333#444444; ...
使用OpenCombine(不使用zip)执行以下操作的最简单方法是什么

let z=zip(colorPublisher,colorPublisher.colorDiff()).sink{(e)in}receiveValue:{(元组)in
debugPrint(tuple.description)/(#333333,#333333);(#444444,#111111)。。。
}

我不明白你为什么需要
zip
。如果要从生成颜色开始,请捕获每种颜色,并将其与生成的颜色差异一起沿管道传递

这是一个使用数字的粗略模拟,但它向您展示了我的意思:

var storage = Set<AnyCancellable>()
let data = Array(1...100).shuffled()
struct Info {
    let this: Int
    let diff: Int?
    let first: Bool
}
data.publisher
    .scan (Info(this: 0, diff: 0, first: true)) { info, this in
        Info(this: this, diff: info.first ? nil : this - info.this, first: false)
    }
    .map {($0.this, $0.diff)}
    .sink { print($0) }
    .store(in:&storage)
我们以成对结束:这个数字,以及它与前一个数字的差异(表述为可选,因为第一个数字没有前一个数字可以区分,我们需要一种说法)。但这些正是zip在你想象的场景中会给你的对,不是吗

我想说的是,整个“拆分和重组”的概念与联合收割机的工作方式是背道而驰的。如果管道的后期阶段需要管道早期出现的某个值,则继续通过中间阶段向下传递该值,以及中间阶段正在处理的任何其他值。元组,或者像“我的信息”这样的载体结构,对于这类工作至关重要

您可以进行“拆分和重新组合”,但我无法想象它如何工作,除非使用
zip
。这是我的例子,重写后使用这种方法。使用Combine写出它是一件痛苦的事情,您会注意到我使用了
makeConnectable
connect
,因为否则我的示例中的所有值都会溢出一条路径(因为我的示例实际上不是异步的):

样本输出:

(80, nil)
(47, Optional(-33))
(35, Optional(-12))
...
(39, nil)
(56, Optional(17))
(22, Optional(-34))
...

我不明白你为什么需要
zip
。如果要从生成颜色开始,请捕获每种颜色,并将其与生成的颜色差异一起沿管道传递

这是一个使用数字的粗略模拟,但它向您展示了我的意思:

var storage = Set<AnyCancellable>()
let data = Array(1...100).shuffled()
struct Info {
    let this: Int
    let diff: Int?
    let first: Bool
}
data.publisher
    .scan (Info(this: 0, diff: 0, first: true)) { info, this in
        Info(this: this, diff: info.first ? nil : this - info.this, first: false)
    }
    .map {($0.this, $0.diff)}
    .sink { print($0) }
    .store(in:&storage)
我们以成对结束:这个数字,以及它与前一个数字的差异(表述为可选,因为第一个数字没有前一个数字可以区分,我们需要一种说法)。但这些正是zip在你想象的场景中会给你的对,不是吗

我想说的是,整个“拆分和重组”的概念与联合收割机的工作方式是背道而驰的。如果管道的后期阶段需要管道早期出现的某个值,则继续通过中间阶段向下传递该值,以及中间阶段正在处理的任何其他值。元组,或者像“我的信息”这样的载体结构,对于这类工作至关重要

您可以进行“拆分和重新组合”,但我无法想象它如何工作,除非使用
zip
。这是我的例子,重写后使用这种方法。使用Combine写出它是一件痛苦的事情,您会注意到我使用了
makeConnectable
connect
,因为否则我的示例中的所有值都会溢出一条路径(因为我的示例实际上不是异步的):

样本输出:

(80, nil)
(47, Optional(-33))
(35, Optional(-12))
...
(39, nil)
(56, Optional(17))
(22, Optional(-34))
...
“黑客”解决方法是通过
handleEvents
(OpenCombine有此功能),它允许您截获发布者生命周期内发生的不同事件

//只是一个占位符,提供一个初始值以避免
//可选,无论如何,该值将被第一个
//出版价值
var currentColor=Color.black()
_=colorPublisher
//截取发布的值,将其存储到局部变量中
.handleEvents(接收输出:{currentColor=$0})
.colorDiff()
//现在,将最新收到的颜色和差异组合成一个元组
.map{(currentColor,$0)}
.sink(接收值:{debugPrint($0)})
或者,如果要捕获最后两项(对于3,4…项,可以扩展元组或使用数组):

var latestColors=(secondLast:Color.black(),last:Color.black())
_=colorPublisher
.handleEvents(receiveOutput:{latestColors=(latestColors.last,$0)})
.colorDiff()
.map{(latestColors.last,latestColors.secondLast,$0)}
.sink(接收值:{debugPrint($0)})
关于
zip
运营商的可用性,OpenCombine对此有一个PR-,但是PR还不可合并,但是如果您想查看运营商实现,您可以使用该分支