尝试将类型添加到 Swift 闭包中的 shorthand 参数名称

Trying to add a Type to shorthand argument name in Swift closure

我有下面的代码片段,编译器告诉我: 没有更多上下文,表达式类型不明确。我曾尝试在 !$0 之前添加 [Term] 但它没有用,我也尝试解构闭包但是 !zip 给我带来了很多麻烦。我该如何解决这个问题?

extension Statement : Equatable {}
func == (lhs: Statement, rhs: Statement) -> Bool {
  return lhs.terms.count == rhs.terms.count
    && !zip(lhs.terms, rhs.terms).contains { ![=12=].isEqualTo() }
}

鉴于您自己写的答案,我假设 Term 等于 Term 当且仅当它们的 属性 value 相等并且声明的条款是均等排序

这在 Swift 2

操场上有效
import UIKit

class Statement {
    var terms: [Term] = []
}

struct Term {
    var value: Int
}

extension Statement : Equatable {}
func == (lhs: Statement, rhs: Statement) -> Bool
{
    guard lhs.terms.count == rhs.terms.count else {
        return false
    }
    for case let tuple in zip(lhs.terms, rhs.terms) where tuple.0.value != tuple.1.value {
        return false
    }

    return true
}

let statement1 = Statement()
statement1.terms = [Term(value: 1), Term(value: 4), Term(value: 4)]

let statement2 = Statement()
statement2.terms = [Term(value: 1), Term(value: 4), Term(value: 4)]

print(statement1 == statement2 ? "They're equal" : "They're Not equal")

// prints They're equal

如果你想在 Statement 中支持未排序的术语,在 Term 中有一个 id 很重要,并且语句 不能 有一个重复的Therm,按照这些规则,这将起作用:

import UIKit

class Statement {
    var terms: [Term] = []
}

struct Term {
    var id: Int
}

extension Statement : Equatable {}
func == (lhs: Statement, rhs: Statement) -> Bool {
    guard lhs.terms.count == rhs.terms.count else {
        return false
    }
    for case let leftTerm in lhs.terms where !rhs.terms.contains({ leftTerm.id == [=11=].id }){
        return false
    }

    return true
}

let statement1 = Statement()
statement1.terms = [Term(id: 6), Term(id: 1), Term(id: 4)]

let statement2 = Statement()
statement2.terms = [Term(id: 1), Term(id: 4), Term(id: 6)]

print(statement1 == statement2 ? "They're equal" : "They're Not equal")

// prints They're equal

希望对您有所帮助 :D