swift中闭包参数的语法是什么?

时间:2016-01-07 22:26:04

标签: swift closures

在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指的是一个闭包/需要一个闭包?标题/文档可能还有其他方式将参数列为闭包吗?

3 个答案:

答案 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 
})

这是一个纯粹的愚蠢的例子,但它说明了问题的第二部分