2017-07-31 59 views
0

我有這樣的循環:重複一次迭代

let names = ["Sandra", "Pedro", "John", "Shay", "Tyrion"] 
var money = 0 


for var nameIndex in 0..<names.count { 
    if money > 30 { 
     print("This name is to be repeated: \(names[nameIndex])") 
     money = 0 
     nameIndex -= 1 
     continue 
    } 
    money += 25 
    print("Her name is \(names[nameIndex])") 
} 

我期待這樣的輸出:

Her name is Sandra 
Her name is Pedro 
This name is to be repeated: John 
Her name is John 
Her name is Shay 
Her name is Tyrion 

然而,似乎

nameIndex -= 1 

不影響實際變量。它暫時減少它,但只要下一次迭代發生,變量就會恢復正常。

實際的輸出是:

*Her name is Sandra 
    Her name is Pedro 
    This name is to be repeated: John 
    Her name is Shay 
    Her name is Tyrion* 

這是因爲如果nameIndex - = 1並沒有什麼影響。

我該如何做到這一點?換句話說,我如何在下一次迭代中再次迭代一個項目。

PS:我上面發佈的示例是描述我的真實應用程序的簡化方式。這是爲了使這項工作:

for var word in 0..<rawText.count { 
     let wordText = rawText[word] 
     let wordLabel = SKLabelNode(fontNamed: "LCDSolid") 
     wordLabel.text = wordText 
     if scalingFactor == nil { 
      scalingFactor = getScalingFactor(labelNode: wordLabel, size: adjustedSize) 
     } 
     wordLabel.fontSize *= scalingFactor 
     let addedWidth = wordLabel.frame.width + self.size.width * CGFloat(0.03) 
     currentWidth += addedWidth 
     if currentWidth > desiredWidth { 
      currentPos = (self.size.width * CGFloat(-0.475), currentPos.y - adjustedSize.height * CGFloat(1.5)) 
      currentWidth = 0 
      word -= 1 
      continue 

     } 
     wordLabel.position = CGPoint(x: currentPos.x + (wordLabel.frame.width * CGFloat(0.5)), y: currentPos.y) 
     currentPos.x += addedWidth 
     print("width is \(wordLabel.frame.width) and current width is \(currentWidth) and actual box width is \(self.size.width)") 
     self.addChild(wordLabel) 
    } 
} 

但我認爲它會更簡單的工作一個簡單的例子。

+0

讓名=「桑德拉」,「佩德羅」,「約翰」,「吉文」,「提利昂」 ] var money = 0 ??? –

回答

2

我覺得這是你想要什麼:

let names = ["Sandra", "Pedro", "John", "Shay", "Tyrion"] 
var money = 0 
var nameIndex = 0 
while nameIndex < names.count { 

     if money > 30 { 
       print("This name is to be repeated: \(names[nameIndex])") 
       money = 0 
       continue 
     } 
     money += 25 
     print("Her name is \(names[nameIndex])") 
     nameIndex = nameIndex + 1 

} 

所需輸出:

Her name is Sandra 
Her name is Pedro 
This name is to be repeated: John 
Her name is John 
Her name is Shay 
This name is to be repeated: Tyrion 
Her name is Tyrion 
1

可能只是用while money > 30替換你的if money > 30就可以了。真的不明白你正在嘗試做的,但它會做你需要什麼,也不需要使用索引,只是正常for-in會做

let names = ["Sandra", "Pedro", "John", "Shay", "Tyrion"] 
var money = 0 

for var nameIndex in 0..<names.count { 
    while money > 30 { 
     print("This name is to be repeated: \(names[nameIndex])") 
     money = 0 
    } 
    money += 25 
    print("Her name is \(names[nameIndex])") 
} 

輸出:

Her name is Sandra 
Her name is Pedro 
This name is to be repeated: John 
Her name is John 
Her name is Shay 
This name is to be repeated: Tyrion 
Her name is Tyrion 
1

發生這種情況的原因是因爲Swift for循環遍歷序列;即,就好像你寫:

for var nameIndex in [0, 1, 2, 3, 4, ... names.count - 1, names.count] 

因此,通過循環第一次運行時,它分配0 nameIndex,第二次通過,其分配1,依此類推。如果您對nameIndex所做的任何更改在循環的下一次迭代中將其重新分配給序列中的下一個元素時都將被刪除。

你真的想在這裏什麼是循環中的C,但因爲那些是從斯威夫特取出了一段時間後,你最好的選擇是可能只是使用一個變量和一個while循環:

var nameIndex = 0 
while nameIndex < 0..<names.count { 
    defer { nameIndex += 1 } 
    // ... 
} 
1

您需要修改您的for loop以實現您的預​​期輸出。並採取布爾continueLoop這決定繼續循環或不

var money = 0 
    let names = ["Sandra", "Pedro", "John", "Shay", "Tyrion"] 
    var continueLoop = false 
    for nameIndex in 0..<names.count { 
     if money > 30 { 
      print("This name is to be repeated: \(names[nameIndex])") 
      continueLoop = true 
     } 
     if continueLoop { 
      money = 0 
     } else { 
      money += 25 
     } 
     print("Her name is \(names[nameIndex])") 
    } 

預期輸出: -

她的名字叫桑德拉

她的名字是佩德羅

這個名字要重複:約翰

她的名字叫約翰·

她的名字是吉文

她的名字是提利昂