swift:闭包声明就像块声明


90

我们可以在Objective-C中声明以下块。

typedef void (^CompletionBlock) (NSString* completionReason);

我试图迅速做到这一点,它给错误。

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

错误:使用未声明的“ completionFunction”

定义:

var completion: CompletionBlock = { }

这该怎么做?

更新:

根据@jtbandes的回答,我可以使用多个参数创建闭包,例如

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()

1
@Downvotters:请解释这个问题出了什么问题?
玛尼2014年

1
许多人认为我们应该先学习快速的语言然后再写作。愚蠢的感觉……
Janak Nirmal 2014年

@Mani嗨,你能不能也呈现出你将如何分配该类型别名的var(即var completion: CompletionBlock = {....}使用多个参数谢谢?
Unheilig

Answers:


141

对函数类型的语法(in) -> out

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

请注意,从Swift 3+起,仅需要在输入类型周围加上括号。


如果需要两个以上的参数,我们该怎么做?您能指导我在那本书还是其他书中参考?
2014年

最适合Swift的书:Apple Inc.“ Swift编程语言”。iBooks。itun.es/ca/jEUH0.l
David Skrundz 2014年

@NSArray我知道只有一本书可供快速阅读。但是我想问的是与主题相对应的一章... :)
Mani 2014年

4
@jtbandes正在工作。我创建了两个参数,例如typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani

@zumzum它将参数名“ reason”与方法体“ println(reason)” 分隔开
jtbandes 2014年

13

是关于快速关闭的很棒的博客。

这里有些例子:

作为变量:

var closureName: (inputTypes) -> (outputType)

作为可选变量:

var closureName: ((inputTypes) -> (outputType))?

作为类型别名:

typealias closureType = (inputTypes) -> (outputType)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.