2017-04-15 71 views
-8

如何在swift 3.0中编写此代码。使用For循环?如何在swift 3.0中编写此代码。使用For循环

for (int index = 0; index < 100; index += (1 + index)) {   
    printf("%d\t",index);  
} 
+1

该代码似乎毫无意义。 这将产生奇怪的结果。 Swift不再具有C风格的for(;;)'构造,因此您必须使用while循环来构建它。 这听起来像是给我的家庭作业。是吗? –

+0

相关:http://stackoverflow.com/a/42662061/1630618 – vacawama

回答

1

您的增量正在增加。由于C风格的for循环不可用,您可能会使用这样的代码:

var index = 0 
while index < 100 { 
    print("\(index)", terminator: "\t") 
    index += 1 + index 
} 
print("") 

你也可以写函数式的代码:

for f in sequence(first: 0, 
        next: { 
        $0 + $0 + 1 
}) 
    .prefix(while: {$0 < last}) { 
    print(f, terminator: "\t") 
} 
print("") 

(前缀功能需要雨燕3.1 )

+0

Up投票正确翻译,包括使用终止符打印。 – vacawama

1

这种for循环来自C,与Swift语言的设计和精神背道而驰。这就是为什么它在Swift 3中被淘汰的原因(你可以找到更多关于它的移除here)。

C风格的for循环有三种说法:

首先,有个初始化语句,,您可以设置一个或多个变量。在这种情况下,初始化语句是:

int index = 0 

这斯威夫特成为

var index = 0 

然后,还有的循环不变,这是必须在一开始和结束满足的条件每次通过循环。在这种情况下,循环不变是:

index < 100 

Swift代码与C代码非常相似。

最后,我将其称为更改语句,它会更改循环中的某些条件,需要对其进行评估,以确定是否需要通过循环创建另一个通道。在这种情况下,它的这种说法:

index += 1 + index 

同样,斯威夫特代码几乎是相同的C代码。

你应该使用while循环,以及等效斯威夫特代码如下所示:

while index < 100 { 
    print("\(index)\t") 
    index += 1 + index 
} 

index += 1 + index代码,而有效的,是不寻常的。你确定你想要吗?还是你想要更常见的index += 1

+0

好,清晰,一步一步的答案。一个小点虽然。 C'printf()'函数不会终止该行,默认情况下Swift的'print()'函数会执行该行。在我的回答中,我提供了可选的终止符参数,该参数用标签替换正常的换行符。您的代码将在循环中显示一个新行,这与提供的C代码不同。 –

0

如果你必须使用一个for循环,你可以使用一个序列,但是这将是比while循环更详细和繁琐:

for index in sequence(first:0, next:{ let index = $0 + $0 + 1; return index < 100 ? index : nil}) 
{ 
    print("\(index)") 
} 

你也可以使用一个通用的概括这对任何类型和增量功能:

func cFor<T>(_ start:T, _ condition:@escaping (T)->Bool, _ increment:@escaping (inout T)->()) -> UnfoldSequence<T, (T?, Bool)> 
{ 
    return sequence(first:start, next:{ var next = $0; increment(&next); return condition(next) ? next : nil }) 
} 

for index in cFor(0,{$0<100},{$0 += $0 + 1}) 
{ 
    print("\(index)") 
}