Swift中块的语法

我正在尝试从Objective-C重写到Swift,我不能编写语法或理解文档

Objective-C中有一个简单的例子,我写道:

[UIView animateWithDuration:10.0 animations:^{self.navigationController.toolbar.frame = CGRectMake(0,10,0,10);}]; 

我如何在Swift中编写这个?

这是模板自动完成给出:

 UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)) 

由于预期的参数types和返回types的animation参数是已知的编译器可以推断他们没有问题。 这应该工作(虽然我目前没有可用的操场:

 UIView.animateWithDuration(10.0, animations: { self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0) }) 

有closures包的更多信息,请参阅swift文档中的章节

有关CGRect() – 开发人员文档显示在快速代码中使用CGRect() 。 也许它需要一个导入?

更新评论:你也可以使用像这样的尾随闭包:

 UIView.animateWithDuration(10.0) { self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0) } 

这是迅捷的封闭格式:

 {(parameter:type, parameter: type, ...) -> returntype in //do stuff } 

这是你应该做的:

 //The animation closure will take no parameters and return void (nothing). UIView.animateWithDuration(duration: NSTimeInterval, animations: {() -> Void in //Animate anything. }) 

这是closures的文档 。

以下代码可以指导您编写自己的块。

 class func testFunc(completion: ((list : NSArray!) -> Void)?) { //--- block code. if completion! != nil { completion! (list: NSArray()) } } 

你可以把它叫做 –

 className.testFunc { (list: NSArray!) -> Void in } 

基本上可以用三种相同的方式来写:

在闭包/代码块中写下什么是正确的:

 UIView.animateWithDuration(10.0) { self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0) } 

这也被称为尾随闭包 (如果闭包参数是最后一个参数,则只能执行尾随闭包)

这并不意味着参数“animation”不再被写入。 它被写入,但正如上面的格式。


正好写在行内,大多数开发人员避免这样做,因为用所有的括号和大括号来写是一个小错误。

 UIView.animateWithDuration(10.0, animations: { self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0) }) 

(与尾部封闭相反,你写的名字,即'animation')这就是所谓的内嵌闭包


写在更模块化的意义上

 UIView.animateWithDuration(duration: NSTimeInterval, animations: animatingFunc) func animatingFunc() { self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0) } 

记住参数'animation'的types是() -> Void

就像我们正在做的那样,animatingFunc不带任何参数,例如'()'并且不返回任何东西,即'void'

(在Swift中,函数是types,可以作为参数传入)有些人可能会说这是更可读的有些人可能会说尾随的closures是…


附注1你也可以什么都不做(这真的没有意义,但在许多其他的处理程序/animation/完成处理程序,你可能不想做任何事情)

 UIView.animateWithDuration(duration: NSTimeInterval, animations: nil) 

附注2

当你必须捕捉价值时,闭包变得更有趣。 看到这个简单的演示。 有关Swift闭包的更多信息,请参阅Apple的文档