2017-04-15 102 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)") 
}