考慮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