如何删除警告“无法同时匹配多个关联值”

Har*_*lue 0 tuples ios xctest swift

我的单元测试中有一个辅助方法:

  func expect(_ sut: CompanyStore, toRetrieve expectedResult: RetrieveCacheResult, when action: @escaping (() -> Void), file: StaticString = #file, line: UInt = #line) {
    let exp = expectation(description: "await completion")

    sut.retrieve { retrievedResult in
      switch (expectedResult, retrievedResult) {
      case (.empty, .empty), (.failure, .failure):
        break
      case let (.found(retrieved), .found(expected)):
        XCTAssertEqual(retrieved.item, expected.item, file: file, line: line)
        XCTAssertEqual(retrieved.timestamp, expected.timestamp, file: file, line: line)

      default:
        XCTFail("Expected to retrieve \(expectedResult), got \(retrievedResult) instead", file: file, line: line)
      }

      exp.fulfill()
    }
    action()
    wait(for: [exp], timeout: 1.0)
  }
Run Code Online (Sandbox Code Playgroud)

它允许我创建测试,例如:

  func test_retrieve_delivers_empty_on_empty_cache() {
    let sut = makeSUT()
    expect(sut, toRetrieve: .empty, when: {
      // some action to perform
    })
  }
Run Code Online (Sandbox Code Playgroud)

升级到 Swift 5.1 后,我收到以下警告:

无法同时匹配多个关联值,隐式地对关联值进行元组化并尝试匹配该值

在以下行

 case let (.found(retrieved), .found(expected)):
Run Code Online (Sandbox Code Playgroud)

这些值是一个元组 (item: LocalCompany, timestamp: Date)

我一直无法弄清楚如何清除此警告。

编辑:

.found 是一个枚举:

 case let (.found(retrieved), .found(expected)):
Run Code Online (Sandbox Code Playgroud)

Jes*_*ssy 8

您有两个选择:

  1. 将关联值重新定义为元组。
case found( (item: Int, timestamp: Bool) )
Run Code Online (Sandbox Code Playgroud)
  1. 单独提取所有成员。
case let (
  .found(retrievedItem, retrievedTimestamp),
  .found(expectedItem, expectedTimestamp)
):
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢在这里巧妙地使用表情符号 (7认同)