讓我們來分析一下:
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
:最後一個參數是您傳遞的用於確定序列拆分位置的閉包。
由於maxSplit
和allowEmptySlices
都有默認參數,所以除非要更改它們,否則不需要將它們包含在函數調用中。您必須提供的唯一參數是關閉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
參數允許您傳遞引發錯誤的閉包,但您不必。任何時候一個函數接受一個拋出錯誤的閉包,它也會接受一個不拋出的閉包。這是因爲非拋出函數是拋出函數的子類型。
@noescape
:isSeparator
參數標記爲@noescape
。這僅僅意味着在關閉split
的電話結束時,關閉中的任何內容都不會存活。