Nimble框架contain匹配器不支持数组的数组?类型转换错误咨询
为什么二维数组用Nimble的contain会报错?
这个问题其实是Nimble匹配器重载解析和类型推断在嵌套集合场景下的小坑,我来给你拆解清楚:
核心原因:编译器选了错误的contain重载
Nimble的contain匹配器有多个重载版本,针对一维和二维数组,编译器的选择不一样:
一维数组正常运行的原因:
当你写expect(["a","b"]).to(contain(["a","b"]))时,编译器能精准识别出你要调用的是「检查集合是否包含序列中所有元素」的重载。这个重载返回的Predicate<[String]>和expect的[String]类型完全匹配,所以编译毫无问题。二维数组报错的原因:
到了expect([["a"],["b"]]).to(contain([["a"],["b"]]))这里,嵌套数组的结构让编译器的类型推断出现了歧义——它错误地选中了另一个重载:「检查集合是否包含单个符合NMBContainer协议的元素」。这个重载返回的是Predicate<NMBContainer>,但你的目标类型是[[String]],两者类型不兼容,自然就抛出了那个类型转换错误。
两种快速解决方法
你可以任选一种方式来修正这个问题:
显式指定类型参数
直接告诉编译器你要使用的是针对[[String]]的序列重载,强制它选对版本:expect([["a"],["b"]]).to(contain<[[String]]>([["a"],["b"]]))改用containElements匹配器
Nimble专门提供了containElements来处理“检查集合包含序列所有元素”的场景,它对嵌套集合的类型推断更友好,不用额外指定类型:expect([["a"],["b"]]).to(containElements([["a"],["b"]]))
内容的提问来源于stack exchange,提问作者Julian A.
相关产品推荐
相关产品推荐

