Swift 找不到正确的类型

标签 swift generics hamcrest

我正在尝试使用 SwiftHamcrest

我有一个函数

func equalToArray<T, S>(_ vector:Array<S>) -> Matcher<T> {
  let v: Matcher<T> = Hamcrest.hasCount(16)
  return v
}

这会报错

Error:(16, 31) 'hasCount' produces 'Matcher<T>', not the expected contextual result type 'Matcher<T>'

SwiftHamcrest 有两个 hasCount 函数

public func hasCount<T: Collection>(_ matcher: Matcher<T.IndexDistance>) -> Matcher<T> 
public func hasCount<T: Collection>(_ expectedCount: T.IndexDistance) -> Matcher<T> 

为什么我的代码没有返回所需的相同类型。

作为一个注释,可能还有一个不同的问题,我不得不添加 Hamcrest。在 hasCount 方法调用之前,否则它会尝试匹配第一个函数

我缺少什么类型?

最佳答案

你的方法 equalToArray<T, S>不知道T是一个集合,所以通用 hasCount(...) 的结果上述方法不能分配给 v在你的方法中(因为这些结果返回 Matcher<T> 实例限制为 T :s 即 Collection :s)。即 v属于 Matcher<T> 类型对于不受约束的 T ,意思是,在编译器的眼中,有例如没有T.IndexDistance对于 Tv :s 类型。

如果你添加一个Collection T 的类型约束你的方法,来自 hasCount(...) 的作业结果为 v应该编译:

func equalToArray<T: Collection, S>(_ vector: Array<S>) -> Matcher<T> {
    let v: Matcher<T> = Hamcrest.hasCount(16)
    return v
}

在一个完美的世界里,编译器可以给我们一个更有说服力的错误信息,比如

Error:(16, 31) 'hasCount' produces 'Matcher<T>' where 'T: Collection', not the expected contextual result type 'Matcher<T>'


现在,我不知道你打算在这里测试什么,但正如@Hamish 指出的那样,你可能实际上想要返回一个 Matcher<[S]>并删除 T占位符。例如。使用 count所提供的属性 vector参数作为 hasCount(...) 的参数?

func equalToArray<S>(_ vector: Array<S>) -> Matcher<[S]> {
    return hasCount(vector.count)
}

我自己没有使用过 Hamcrest,我可能会弄错,但基于对 SwiftHamcrest 文档的快速浏览,我相信 equalToArray(_:)如上定义将仅基于两个向量的计数为“向量相等性”(w.r.t. 函数名称的语义)构造一个匹配器,在这种情况下,以下断言将成功

let arr1 = ["foo", "bar"]
let arr2 = ["bar", "baz"]

assertThat(arr1, equalToArray(arr2)) // success! ...

但这只是署名,因为您没有向我们展示您打算应用 equalToArray(_:) 的上下文方法/匹配器;也许您只是向我们展示了一个最小的示例,而您的自定义匹配器的实际主体更符合方法的名称。

关于Swift 找不到正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43456245/

相关文章:

ios - 可重用的 Swift 扩展和选择器

java - 日期的 Hamcrest 库

java - 编译器应该用泛型集合捕获这个错误吗?

generics - 如何在泛型中强制使用子类/协议(protocol)

java - 如何使用 JUnit 和 Hamcrest 测试 .equals() 方法

java - 如何使用 AssertThat 检查列表中对象的属性值?

ios - 火力地堡崩溃。 xcode 9.没有谷歌服务

swift - 为什么我可以在 Swift 中将 NSNumber 的值设置为 true/false?

ios - NSMethodSignature 和 NSInvocation 等价于 swift 2

ios - 在 swift 中无法访问泛型结构的可解码对象中的嵌套值?