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的文档