当我cmd单击Xcode中的分割功能时,它会转到头文件。这就是它的内容
public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence]
以下实现如何与上述声明一起使用?
someString.characters.split { $0 == "." }
答案 0 :(得分:5)
您的专家splitlist[order(sapply(splitlist, function(x) (x[["Revenue"]])))]
使用someString.characters.split { $0 == "."}
和maxSplit
的默认值,并指定allowEmptySlices
的自定义关闭。 调用函数isSeparator
的某些更长版本是:
split
由于上面的代码使用与实际默认值(let arr = str.characters.split(Int.max, allowEmptySlices: false) { (char) -> Bool in
char == "."
}
和Int.max
相同的值),因此您可以删除前两个参数,因为闭包是最后一个参数(使其成为尾随闭包)您可以省略整个参数,只需按以下方式编写闭包:
false
现在我们可以通过省略特定签名来简化闭包:
let arr = str.characters.split { (char) -> Bool in
char == "."
}
答案 1 :(得分: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
:最后一个参数是您传递的闭包,用于标识拆分序列的位置。
由于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
的调用结束后继续存在。
答案 2 :(得分:2)
someString.characters.split { $0 == "."}
相当于
someString.characters.split(isSeparator: { $0 == "."})
代码中的闭包称为trailing closure,函数的最后一个参数的闭包可以放在函数声明之后,如果没有其他参数,你也可以省略()
前两个参数具有默认值,因此可以省略它们,从而导致您发布的简化调用。