考虑Foo
类型:调用SequenceType.forEach时,有没有办法引用实例函数?
class Foo {
var isBaz: Bool {
return false
}
func bar() {
print("some boring print")
}
}
现在让我们说,我想通过类实例的集合进行迭代,并呼吁他们每个人的一些功能:
let someFoos: [Foo] = [Foo(), Foo(), Foo()]
someFoos.forEach { $0.bar() }
这个语法是相当紧凑,但它感觉有点尴尬。此外,它无法在任何地方使用。例如,在一个if
语句条件:
if someFoos.contains { $0.isBaz } {
// compiler error: statement cannot begin with a closure expression
}
if someFoos.contains($0.isBaz) {
// compiler error: anonymous closure argument not contained in a closure
}
if someFoos.contains({ $0.isBaz }) {
// this is correct, but requires extra pair of parentheses
}
理想的情况下,这将是很好写类似
someFoos.forEach(Foo.bar)
但雨燕2.1的,这是不是一个正确的语法。这种参考函数的方式类似于以下内容:
func bar2(foo: Foo) -> Void {
print("some boring print")
}
someFoos.forEach(bar2)
有没有更好的方法来引用实例函数?你更喜欢写这样的表达方式?
不清楚问题是什么。什么是不喜欢'someFoos.forEach {$ 0.bar()}'?还不清楚你的'if'结构是否有意完成。 – matt
@matt'someFoos.forEach {$ 0.bar()}'很好,但IMO像'someFoos.forEach(Foo.bar)'会更好(更容易阅读)。 'if'语句只是为了说明在某些情况下需要额外的括号来使用'someFoos.forEach {$ 0.bar()}'语法,这使得代码不易读。 –
你并没有真正回答这个问题。 “IMO”不是问题,Stack Overflow拒绝基于意见的问题。你有什么问题?严重的是,你希望从这些“if”例子中得到什么样的行为?也许还有另一种方法,如果你只是说你想要的代码_do_。 – matt