2016-01-07 5 views
9

私がcmdを使ってsplit関数をクリックすると、ヘッダファイルが表示されます。これは読んでいるものですスウィフトヘッダの読み方

public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence] 

上記の宣言では、次の実装はどのように機能しますか?

someString.characters.split { $0 == "." } 

答えて

5

のは、それを打破してみましょう:

public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence] 

maxSplit:最初のパラメータ、maxSplit、あなたは順序がに分割されます作品の最大数を指定することができます。デフォルトはInt.maxです。

allowEmptySlices:2番目のパラメータallowEmptySlicesは、シーケンス内の2つの連続する区切り文字が空のスライスにつながるかどうかを指定します。デフォルトはfalseです。たとえば、文字列が"A..B"で、.文字で分割した場合、このパラメータに渡す内容に応じて出力配列に2つ(["A", "B"])または3つ(["A", "", "B"])の項目が表示されます。

isSeparator:最後のパラメータは、シーケンスを分割する場所を特定するために渡すクロージャです。

maxSplitallowEmptySlicesの両方にデフォルトの引数があるので、それらを変更しない限り、関数呼び出しに含める必要はありません。あなたが提供しなければならない唯一のパラメータは、isSeparatorクロージャです。

someString.characters.split { $0 == "."} 

を...と同等である:あなたのケースでは

、あなたはと呼ばれる

someString.characters.split(isSeparator: { $0 == "." }) 
:あなたはまた、このようなあなたの関数呼び出しを書くことができ

someString.characters.split(maxSplit: Int.max, allowEmptySlices: false) { $0 == ".' } 

あなたがそれを書いた方法は、 "終わりの閉鎖"の構文を利用します。関数はクロージャを取る場合、それは最後の引数だとして、次のように括弧外閉鎖を移動することができます。

someString.characters.split() { $0 == "." } 

と機能が一つだけの引数を取る場合(あなたが任意のデフォルト引数を数えません)供給していない、あなたは完全に括弧を省略することができます:最高レベルで

someString.characters.split { $0 == "." } 

を、何が起こるかは、文字のシーケンスを通じてsplit反復処理することです。指定されたクロージャを使用して各文字をテストし、クロージャがtrueを返した場合、その文字のシーケンスを分割します。あなたのケースでは、それは"."を見つけるたびに文字のシーケンスを分割します。

他のいくつかの注意事項:

rethrows:全体の機能がrethrowsをマークされています。エラーをスローしますが、引数isSeparatorのために渡したクロージャがエラーをスローした場合に限ります。 isSeparatorパラメータを使用すると、エラーをスローするクロージャを渡すことができますが、そうする必要はありません。関数がエラーをスローするクロージャを受け入れるたびに、スローされないクロージャも受け入れられます。これは、非投げ込み関数が投げ関数のサブタイプであるためです。

@noescapeisSeparatorのパラメータには@noescapeと表示されます。これは単に、splitへの呼び出しの最後を過ぎてもクロージャの中に何も残らないことを意味します。

5

あなたのラインsomeString.characters.split { $0 == "."}maxSplitallowEmptySlicesのデフォルト値を使用し、isSeparatorのカスタムクロージャを指定します。 機能splitを呼び出すいくつかの長いバージョンは次のとおりです。

let arr = str.characters.split(Int.max, allowEmptySlices: false) { (char) -> Bool in 
    char == "." 
} 

上記のコードは、実際のデフォルト(Int.maxfalse)と同じ値を使用するので、あなたが最初の2つのパラメータを削除することができますし、クロージャが最後であるため、パラメータ(その末尾に閉鎖すること)あなたが全体のパラメータを省略し、単に次のように閉鎖を書くことができます。

let arr = str.characters.split { (char) -> Bool in 
    char == "." 
} 

今、私たちは、特定の署名を省略することによって、クロージャを簡略化することができます。

let arr = str.characters.split { $0 == "." } 
2
someString.characters.split { $0 == "."} 

あなたのコード内の閉鎖がtrailing closureと呼ばれる

someString.characters.split(isSeparator: { $0 == "."}) 

に相当し、関数の最後のパラメータですクロージャは関数宣言の後に置かれ、その他の場合はすることができますパラメータが残っている場合は、()も省略できます。

最初の2つのパラメータにはデフォルト値が設定されているため、省略することができます。