当我cmd单击Xcode中的分割功能时,它会转到头文件.这就是它的内容
public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence]
Run Code Online (Sandbox Code Playgroud)
以下实现如何与上述声明一起使用?
someString.characters.split { $0 == "." }
Run Code Online (Sandbox Code Playgroud)
您的行someString.characters.split { $0 == "."}使用和的默认值,maxSplit并为其allowEmptySlices指定自定义闭包isSeparator.调用该函数的一些较长版本split是:
let arr = str.characters.split(Int.max, allowEmptySlices: false) { (char) -> Bool in
char == "."
}
Run Code Online (Sandbox Code Playgroud)
由于上面的代码使用与实际默认值(Int.max和false)相同的值,您可以删除前两个参数,因为闭包是最后一个参数(使其成为尾随闭包),您可以省略整个参数并简单地在以下方式:
let arr = str.characters.split { (char) -> Bool in
char == "."
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过省略特定签名来简化闭包:
let arr = str.characters.split { $0 == "." }
Run Code Online (Sandbox Code Playgroud)
让我们分解一下:
public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence]
Run Code Online (Sandbox Code Playgroud)
maxSplit:第一个参数,maxSplit允许您指定序列将被拆分的最大块数.默认是Int.max.
allowEmptySlices:第二个参数,allowEmptySlices指定序列中的两个连续分隔符是否应该导致空切片.默认是false.例如,如果您有一个字符串,"A..B"并且您在.字符上拆分,则最终可能会在输出数组中使用两个(["A", "B"])或三个(["A", "", "B"])项,具体取决于您为此参数传递的内容.
isSeparator:最后一个参数是您传递的闭包,用于标识拆分序列的位置.
由于两个maxSplit和allowEmptySlices具有默认参数,除非你想改变他们,你并不需要将它们包含在你的函数调用.您必须提供的唯一参数是isSeparator闭包.
在你的情况下,你打电话给:
someString.characters.split { $0 == "."}
Run Code Online (Sandbox Code Playgroud)
......相当于:
someString.characters.split(maxSplit: Int.max, allowEmptySlices: false) { $0 == ".' }
Run Code Online (Sandbox Code Playgroud)
您也可以像这样编写函数调用:
someString.characters.split(isSeparator: { $0 == "." })
Run Code Online (Sandbox Code Playgroud)
你编写它的方式使用了"尾随闭包"语法.如果一个函数接受一个闭包作为它的最后一个参数,你可以将闭包移到括号之外,如下所示:
someString.characters.split() { $0 == "." }
Run Code Online (Sandbox Code Playgroud)
如果函数只接受一个参数(不计算你没有提供的任何默认参数),那么你可以完全省略括号:
someString.characters.split { $0 == "." }
Run Code Online (Sandbox Code Playgroud)
在最高级别,会发生的是split迭代字符序列.它使用提供的闭包测试每个字符,如果闭包返回true,它会在该字符上拆分序列.在你的情况下,它会在每次定位时拆分字符序列".".
其他一些说明:
rethrows:整个功能被标记rethrows.它会抛出一个错误,但前提是你为isSeparator参数传递的闭包会抛出一个错误.请注意,该isSeparator参数允许您传递抛出错误的闭包,但您不必这样做.每当函数接受抛出错误的闭包时,它也会接受不抛出的闭包.这是因为非投掷函数是投掷函数的子类型.
@noescape:isSeparator参数已标记@noescape.这只是意味着闭包中的任何内容都不会在调用结束后继续存在split.