2016-09-27 13 views
1

假設我有用戶的姓名斯威夫特:在無法使用濾鏡陣列,如果讓語句條件

let users = ["Hello", "1212", "12", "Bob", "Rob"] 

我希望得到他的名字長度爲2的第一個用戶的數組,所以我過濾的陣列,並得到第一用戶

if let selected = users.filter{$0.characters.count == 2}.first { 
    print(selected) 
} 

此代碼下迅速2.2

Consecutive statements on a line must be separated by ';'

投擲編譯錯誤

然而,這是工作的罰款雖然

let selected = users.filter{$0.characters.count == 2}.first 
if let selected = selected { 
    print(selected) 
} 

誰能解釋爲什麼我需要先保存過濾結果在一個單獨的變量?任何幫助將非常感激。

回答

5

您可以通過將您傳遞到filter關閉加上括號,使這項工作:

if let selected = users.filter({$0.characters.count == 2}).first { 
    print(selected) 
} 

這是做正確的方式。尾隨閉包語法有時在具有額外元素的行上效果不佳。你也可以在整個聲明中加上括號:

if let selected = (users.filter {$0.characters.count == 2}.first) { 
    print(selected) 
} 

Swift在解析語句時遇到了麻煩。括號給它在如何解析線路上的幫助。你應該更喜歡第一種方法,因爲閉包的確是filter的一個參數,所以將它括在括號中可以讓Swift清楚你將它傳遞給filter

+0

是的,這個工程。你能解釋一下這種行爲嗎? – jimmy0251

+0

是的,太棒了!謝謝 –