在Swift头文件中,isSeparator:
参数接受一个闭包
public func split(maxSplit: Int = default, allowEmptySlices: Bool = default, @noescape isSeparator: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.SubSequence]
但是在documentation中,它以不同的方式列出了闭包语法
{ (parameters) -> return type in
statements
}
你怎么知道(Self.Generator.Element) throws -> Bool rethrows
指的是一个闭包/需要一个闭包?标题/文档可能还有其他方式将参数列为闭包吗?
答案 0 :(得分:6)
"""放弃这是一个封闭是->
。完整类型是
(Self.Generator.Element) throws -> Bool
这意味着闭包采用Self.Generator.Element
类型的变量,并且必须在基于输入的某些计算时返回Bool
。这样做可能会产生一些错误 - 这就是投掷的目的。
你写的是什么
{ (parameters) -> return type in
statements
}
将是一个实际实现,是一些通用闭包类型的值。
闭包的类型例如是(someInt:Int, someDouble:Double) -> String
:
var a : ((someInt:Int, someDouble:Double) -> String)
再次说明a实际上是一个闭包的东西是类型声明中的->
。
然后您通过第二个代码块之后的某些代码段为a
分配内容:
a = { (integer, floating) -> String in
return "\(integer) \(floating)"
}
答案 1 :(得分:2)
您可以通过参数的类型来判断。 Swift中的所有东西都有一个类型,包括函数和闭包。
例如,这个功能......
func add(a: Int, to b: Int) -> Int { return a + b }
...的类型为(Int, Int) -> Int
。 (它需要两个Int
作为参数,并返回Int
。)
这封闭......
let identity: Int -> Int = { $0 }
...的类型为Int -> Int
。
每个函数和闭包都有一个类型,并且在类型签名中总是有一个->
,它将参数与返回值分开。因此,只要您看到其中包含isSeparator
的参数(如->
),就会知道该参数需要关闭。
答案 2 :(得分:1)
isSeparator
定义意味着(Self.Generator.Element) throws -> Bool
您将获得一个元素,并且您应该返回一个Bool。当您调用split时,您可以执行以下操作:
[1,2,3].split(…, isSeparator : { element -> Bool in return false })
这是一个纯粹的愚蠢的例子,但它说明了问题的第二部分