我嘗試在特定時刻回圈添加 1 到 i?當我這樣做時,它會在回圈開始時立即達到“正常”值。
for var i in (0..<10)
{
if (i == 2)
{
i = 1
}
}
編輯:
具體代碼:
for var i in (0..<models.count)
{
if (i > 0 && models[i].label1 == models[i-1].label1)
{
models[i-1].slots.append(contentsOf: models[i].slots)
models.remove(at: i)
i -= 1
}
}
uj5u.com熱心網友回復:
問題是因為它i的范圍僅限于回圈塊。每一輪你實際上都會得到一個新的i.
有三種解決方案。
第一個是while按照 Duncan C 的回答使用回圈。
第二個是維護一個單獨的索引,仍然使用一個for回圈,但這真的和第一個一樣
最好的答案 IMO 是從最后倒數。
for i in (1 ..< models.count).reversed()
{
if (models[i].label1 == models[i-1].label1)
{
models[i-1].slots.append(contentsOf: models[i].slots)
models.remove(at: i)
}
}
當然,反轉一個數字串列對于長串列來說會很昂貴,所以你可以考慮使用
如果我們更改i為 var:
for var i in 0..<3 {
print("a: i =", i)
i = 7
print("b: i =", i)
}
我們可以編譯并運行代碼,但是……每次回圈i都會被賦予迭代中的下一個值,我們會得到這個:
a: i = 0
b: i = 7
a: i = 1
b: i = 7
a: i = 2
b: i = 7
如前所述Duncan C,如果我們想實際修改i,正確的做法是使用while回圈。
那么......為什么我們可以用其他語言(例如Objective-C)來做到這一點:
for (int i = 0; i < 3; i ) {
NSLog(@"a: i = %d", i);
i = 7;
NSLog(@"b: i = %d", i);
}
并得到這個輸出:
a: i = 0
b: i = 7
回圈退出?
那是因為:

是一種更簡潔但功能等效的撰寫方式:

SwiftFor-In回圈更類似于 Objective-CFor-In Fast Enumeration回圈:
for (NSNumber *n in @[@0, @1, @2]) {
NSLog(@"n = %@", n);
}
輸出:
n = 0
n = 1
n = 2
并且,如果我們嘗試n在回圈內進行修改:

所以我們做到了__strong:
for (__strong NSNumber *n in @[@0, @1, @2]) {
NSLog(@"a: n = %@", n);
n = @7;
NSLog(@"b: n = %@", n);
}
并且輸出是 - 正如您可能猜到的那樣:
a: n = 0
b: n = 7
a: n = 1
b: n = 7
a: n = 2
b: n = 7
希望那些對你有幫助。
uj5u.com熱心網友回復:
在 Swift 的 for 回圈中,變數 ( i) 被視為一個 let 常量,您不能在回圈內對其進行變異。
這似乎是對的。能夠在回圈內改變回圈變數會導致各種意想不到的副作用。
您可以使用 while 回圈來獲得相同的效果:
以下作品:
var i = 0
while i < 10 {
print(i)
if i.isMultiple(of: 2) && Int.random(in: 1...3) == 2 {
i -= 1
}
i = 1
}
print("Done")
此代碼引發編譯器錯誤:
for index in 1...10 {
if index.isMultiple(of: 3) {
index = 1 // <- Error: "left side of mutating operator isn't mutable: 'index' is a 'let' constant"
print(index)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512550.html
標籤:IOS迅速for循环变量
上一篇:如何列印輸入但每行洗掉一個單詞?
下一篇:遍歷嵌套物件并估算遺漏鍵
