2016-09-27 15 views
1

は私がその名前の長さ最初のユーザーを取得したいユーザーの名前スウィフト:聞かせステートメント条件

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

の配列が2であるので、私は、配列を濾過し、持っていると仮定した場合には、配列のフィルタを使用することはできません最初のユーザー

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

このコードは、SWIFT 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) 
} 

スウィフトは文の解析に問題があります。かっこは、行を解析する方法を助けます。クロージャが実際にfilterのパラメータであるため、最初の方法を優先する必要があります。そのため、カッコで囲むと、filterに渡すことがわかります。

+0

はい、これは機能します。あなたはその行動を説明できますか? – jimmy0251

+0

はい、素晴らしい!ありがとう –

関連する問題