2016-01-07 87 views
9

當我cmd單擊Xco​​de中的拆分功能時,它將我帶到頭文件。這是它讀取的內容如何讀取swift頭文件

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:第二個參數allowEmptySlices指定序列中的兩個連續分隔符是否應導致空片。默認值是false。例如,如果您有一個字符串,"A..B",並且您在.字符上分開,則最終可能會在輸出數組中包含兩個(["A", "B"])或三個(["A", "", "B"])項,具體取決於您爲此參數傳遞的內容。

isSeparator:最後一個參數是您傳遞的用於確定序列拆分位置的閉包。

由於maxSplitallowEmptySlices都有默認參數,所以除非要更改它們,否則不需要將它們包含在函數調用中。您必須提供的唯一參數是關閉isSeparator

在你的情況,你叫:

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

...這是等價的:

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

你也可以寫你的函數調用是這樣的:

someString.characters.split(isSeparator: { $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)可以去除前兩個參數和自閉是最後一個參數(使其尾部封閉),則可以省略整個參數和簡單的寫在下面的方式關閉:

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

現在我們可以通過省略特定的簽名簡化封閉:

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

相當於

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

在代碼中關閉被稱爲trailing closure,這是最後一個參數的函數可以放置在函數聲明之後關閉,如果沒有其他參數保持不變,您也可以省略()

前兩個參數具有默認值,所以它們可以省略,從而導致您發佈的簡化呼叫。