Swift数组<set>如果$ 0设置与另一组匹配,我如何映射并返回true?

时间:2017-10-24 18:16:27

标签: arrays swift

我有一个数组arrCommands,其中有几个不同的集合 - [[“play”],[“play message”],[“play message from”]等。

我正在使用语音识别来获取一些用户输入的命令,我有一个不同命令(播放,消息)等数组,我从所说的单词数组与我的标签数组的交集构建了一个集合。

所以,如果用户说“你能播放这个消息吗”我可以从口头命令中得到[“播放”,“消息”]。然后,我想检查arrCommands,看看这个集合与它所拥有的集合是否匹配。

我试过这样做:

let isCommand = arrCommands.map { if setTags.isSubset(of: $0) { return true } }

但是我得到了这个错误:无法推断出复杂的闭包返回类型;添加显式类型以消除歧义

但添加 - &gt; Bool引发了一系列错误消息。我确信这很简单,我只是错过了它,但任何帮助都会很棒。

3 个答案:

答案 0 :(得分:3)

我相信你想要:

let isCommand = arrCommands.contains { setTags.isSubset(of: $0) }

如果这不会通过,那么你可能会在某处出现类型不匹配。

请注意你的闭包:

{ if setTags.isSubset(of: $0) { return true } }
如果条件为Bool

将返回true,如果条件为Void,则返回false。编译器无法确定返回类型应该是什么。

答案 1 :(得分:2)

以下是您的陈述:

let isCommand = arrCommands.map { if setTags.isSubset(of: $0) { return true } }

所以,return truesetTags.isSubset(of: $0)

当条件为假时会发生什么?您没有任何其他return声明。因此,当条件为假时,闭包返回()(也称为Void)。

为了推断闭包返回的类型,编译器需要找到一个类型为BoolVoid的超类型。没有这种类型。编译器放弃尝试找到它并发出一个非常有用的错误消息。

您可以通过添加第二个return语句来解决此问题:

let isCommand = arrCommands.map { if setTags.isSubset(of: $0) { return true } else { return false } }

但通常情况下,if x { return true } else { return false }return x完全相同。所以简化:

let isCommand = arrCommands.map { return setTags.isSubset(of: $0) }

由于闭包中只有一个语句,您甚至可以省略return关键字:

let isCommand = arrCommands.map { setTags.isSubset(of: $0) }

答案 2 :(得分:1)

编译器建议使用语法

arrCommands.map { item -> T in
    return ...
}

并用静态(返回)类型替换T