Swift 1.2中有一个新属性,函数中有闭包参数,文档说:
这表示该参数仅被调用(或在调用中作为@noescape参数传递),这意味着它不能超过调用的生命周期.
在我的理解中,在此之前,我们可以使用[weak self]不让闭包有一个强引用,例如它的类,并且self可以是nil或闭包执行时的实例,但现在,@noescape意味着闭包永远不会被执行如果该课程被去除了资格.我理解正确吗?
如果我是正确的,为什么我会使用@noescape一个常规函数的闭包,当它们的行为非常相似时?
我有一个代码,我需要n在Swift中运行几次.那个最短的语法是什么?
我目前正在使用for循环,但它是很多打字.
for i in 0..<n { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
是否有更短/更好的方式n在Swift中运行相同的代码时间?
Adam Ko为这个问题提供了一个很棒的解决方案,感谢Adam Ko.
顺便说一句,如果像我一样,你喜欢c预处理器(处理#defines的东西),你可能不知道XCode中有一个方便的东西:右键单击你的一个开源文件的主体,靠近底部.. "预处理".它实际上运行预处理器,向您显示将要编译的内容的整体"真实交易".这很棒!
这个问题是风格和代码清晰度的问题.考虑它类似于关于微妙命名问题的问题,或者可用习语中的最佳选择(更易读,更易于维护).
当然,使用这样的循环:
for(NSUInteger _i=0; _i<20; ++_i)
{
.. do this 20 times ..
}
Run Code Online (Sandbox Code Playgroud)
要明确,效果是做N次.(您没有在正文中使用索引.)
我想清楚地告诉读者这是一个基于计数的循环 - 即,索引是无关紧要的,并且在算法上我们做了N次.
因此,我想要一个干净的方式做一次身体N次,没有皇室纠缠或浪漫的承诺.你可以像这样制作一个宏:
#define forCount(N) for(NSUinteger __neverused=0; __neverused<N; ++__neverused)
Run Code Online (Sandbox Code Playgroud)
这很有效.因此,
forCount(20)
{
.. do this 20 times ..
}
Run Code Online (Sandbox Code Playgroud)
然而,可以想象,如果它与未来的某些东西发生碰撞,那里使用的"隐藏"变量可能会造成麻烦.(也许如果你嵌套有问题的控制结构,还有其他问题.)
要明确效率等,这里不是问题.已经有一些不同的控制结构(while,do等等)实际上当然是完全相同的东西,但它们仅仅作为一种风格存在并且向读者清楚地表明代码段落的预期算法含义.有问题."forCount"是另一种这样需要的控制结构,因为"索引无关"计数循环在任何算法编程中都是完全基本的.
有谁知道这真的,真的,非常酷的解决方案?提到的#define只是不满意,而且你已经抛出了一个变量名,不可避免地有人会踩到它.
谢谢!
有几个人基本上问过"但为什么要这样做?"
请看以下两个代码示例:
for ( spaceship = 3; spaceship < 8; ++spaceship )
{
beginWarpEffectForShip( spaceship )
}
forCount( 25 )
{
addARandomComet
}
Run Code Online (Sandbox Code Playgroud)
当然,对于读者来说,这种效果是完全不同的. …