在Swift 3中修复警告"不推荐使用C语言的语句"

SNo*_*Nos 30 for-loop compiler-warnings swift swift2

我已更新Xcode到7.3,现在我对用于创建随机字符串的函数发出警告.

我试图改变for声明, for (i in 0 ..< len){...}但是警告变成了错误.

如何删除警告?

static func randomStringWithLength (len : Int) -> NSString {
  let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  let randomString : NSMutableString = NSMutableString(capacity: len)

  for (var i=0; i < len; i += 1){ // warning
    let length = UInt32 (letters.length)
    let rand = arc4random_uniform(length)
    randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
  }
  return randomString
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ent 62

for在Swift 3中已经弃用了C风格的循环.你可以继续使用它一段时间,但它们肯定会在将来消失.

您可以将循环重写为Swift的样式:

for i in 0..<len {
    let length = UInt32 (letters.length)
    let rand = arc4random_uniform(length)
    randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
Run Code Online (Sandbox Code Playgroud)

由于您根本不在i循环体中使用,因此可以将其替换为:

for _ in 0..<len {
    // do stuffs
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*mon 22

这个博客救了我的命.

递增

for i in 0 ..< len {

}
Run Code Online (Sandbox Code Playgroud)

递减的

for i in (0 ..< len).reverse() {

}
Run Code Online (Sandbox Code Playgroud)

非顺序索引

在哪里使用

for i in (0 ..< len) where i % 2 == 0 {

}
Run Code Online (Sandbox Code Playgroud)

使用跨越或通过

for i in 0.stride(to: len, by: 2) {

}
Run Code Online (Sandbox Code Playgroud)

  • 在有如此清晰模式的情况下,您绝对应该避免使用“where”子句。`0.stride(to: len, by: 2)` 将处理器必须执行的跳转次数减半。 (2认同)

d0y*_*0ye 9

在Swift 3中,这是一个错误

发布了一些常规替换,只需添加

对于Swift 3并需要更改"索引"

for var index in stride(from: 0, to: 10, by: 1){}
Run Code Online (Sandbox Code Playgroud)

  • @AmrAngry只是`用于步长的索引(从:0到:10,由:1){}`:) (3认同)

Ric*_*own 5

我在以下方面取得了成功.您可以按如下方式使用for循环 - 请注意for循环是包含的,因此您可能需要检查len实际上是否大于0:

for i in 0...len - 1 {
  let length = UInt32 (letters.length)
  let rand = arc4random_uniform(length)
  randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用此:

for i in 0 ..< len {
  let length = UInt32 (letters.length)
  let rand = arc4random_uniform(length)
  randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,看起来XCode 7.x 确实帮助你实现目标,但这是一个两步的过程.首先,您必须将增量运算符从(比如)i ++更改为i + = 1,然后XCode警告可帮助您修改循环.