我有下面的代码片段,编译器告诉我: 没有更多上下文,表达式类型不明确。我曾尝试在 !$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 { !$0.isEqualTo($1) }
}
最佳答案
鉴于您自己写的答案,我假设 Term
等于 Term
当且仅当它们的属性 value
相等且条款a 语句均等排序
这适用于 Swift 2 的 playground
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 很重要,而且一个 Statement 不能有一个重复 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 == $0.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
关于swift - 尝试在 Swift 闭包中将类型添加到速记参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030303/