尝试将类型添加到 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
我有下面的代码片段,编译器告诉我: 没有更多上下文,表达式类型不明确。我曾尝试在 !$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