最近,我一直在学习SWIFT的联合框架.

用苹果公司的话说,"Combine框架为应用程序如何处理事件提供了一种声明性方法.您可以为给定的事件源创建单个处理链,而不是潜在地实现多个委托回调或完成处理程序闭包.链的每个部分都是一个Combine运算符,它对从上一步接收的元素执行不同的操作."

在Combine中,有一个名为compactMap的函数,它可以过滤nil值:

import Combine

let strings = ["a", "1.24", "3", "def", "45", "0.23"].publisher

strings
  .compactMap { Float($0) }
  .sink(receiveValue: {
    print($0)
  })
  .store(in: &subscriptions)
)

compactMap in Swift

我用Raku重写了上述代码,如下所示:

my @strings = ["a", "1.24", "3", "def", "45", "0.23"];
my Supply $supply = Supply.from-list(@strings);
my Supply $compact = $supply.map(-> $value {
  try { Num($value) }
  if $! { Empty } else { Num($value) }
 }); # .grep(Num);

$compact.tap(
    &say,
    done => { say 'finished' },
    quit => { say 'done'     }
);

# ()   <--
# 1.24
# 3
# ()   <--
# 45
# 0.23

但它也会输出两个空括号.当在平面数组上而不是在供应上使用贴图时,值为空的贴图将被过滤:

my @strings = ["a", "1.24", "3", "def", "45", "0.23"];

my @compacted = @strings.map(-> $value {
    try { Num($value) }
    if $! { Empty } else { Num($value) }
});

.say for @compacted;

# 1.24
# 3
# 45
# 0.23

Supply中值为Emptymap函数和普通Array中的函数行为是否不一致?

推荐答案

为什么不这样做...

my @strings = ["a", "1.24", "3", "def", "45", "0.23"];

my $supply = Supply.from-list(@strings);
my $compact = $supply.grep(*.Num.so);
$compact.tap(&say);

# 1.24
# 3
# 45
# 0.23

我同意(与故障处理相关)与常规grep(不需要)之间似乎存在一些小的差异……

say @strings.grep(*.Num);
#(1.24 3 45 0.23)

Swift相关问答推荐

是否可以将字典项绑定到文本字段?

如何使用Swift宏向 struct 体及其init函数添加新成员?

如何设置两个不同的视图模型以在我的SwiftUI应用程序中使用相同的数据源?

出错-无法将季节类型的值转换为预期的参数类型';[水果]';

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

同时具有每个文本的标识符的文本组的可扩展性标识符

解码器是否需要具有密钥的外部数据表示?

Swift:结果的失败类型不能是协议 - Type 'any ShadowError' cannot conform to Error

Swift 数组拆分成重叠的块

使用 RxSwift 围绕 async/await 方法创建 Observable

Swift并发:为什么不在其他后台线程上执行任务

使用 Swiftui 水平修剪 Shape()

无法增加系统镜像的大小

在 Select 器上显示alert Select SwiftUI

使用 swift 运行 pod install 时出错

Swift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块

使 struct 可散列?

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

为什么枚举具有计算(computed)属性但在 Swift 中没有存储属性?

swift中相同的数据类型多变量声明