我有一个数组arrCommands,其中有几个不同的集合 - [[“play”],[“play message”],[“play message from”]等。
我正在使用语音识别来获取一些用户输入的命令,我有一个不同命令(播放,消息)等数组,我从所说的单词数组与我的标签数组的交集构建了一个集合。
所以,如果用户说“你能播放这个消息吗”我可以从口头命令中得到[“播放”,“消息”]。然后,我想检查arrCommands,看看这个集合与它所拥有的集合是否匹配。
我试过这样做:
let isCommand = arrCommands.map { if setTags.isSubset(of: $0) { return true } }
但是我得到了这个错误:无法推断出复杂的闭包返回类型;添加显式类型以消除歧义
但添加 - > Bool引发了一系列错误消息。我确信这很简单,我只是错过了它,但任何帮助都会很棒。
答案 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 true
时setTags.isSubset(of: $0)
。
当条件为假时会发生什么?您没有任何其他return
声明。因此,当条件为假时,闭包返回()
(也称为Void
)。
为了推断闭包返回的类型,编译器需要找到一个类型为Bool
和Void
的超类型。没有这种类型。编译器放弃尝试找到它并发出一个非常有用的错误消息。
您可以通过添加第二个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
。