Fix warning "C-style for Statement is deprecated" in Swift 3

36,453

Solution 1

C-style for loop has been deprecated in Swift 3. You can continue using it for a while, but they will certainly disappear in the future.

You can rewrite your loop to Swift's style:

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

Since you don't use i at all in the loop's body, you can replace it with:

for _ in 0..<len {
    // do stuffs
}

Solution 2

This BLOG saved my life.

INCREMENTING

for i in 0 ..< len {

}

DECREMENTING

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

}

NON-SEQUENTIAL INDEXING

Using where

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

}

Using striding to or through

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

}

Solution 3

in Swift 3 it's been an error

some general replacement was posted and just add

For Swift 3 and need to change the "index"

for var index in stride(from: 0, to: 10, by: 1){}

Solution 4

I've had success with the following. You can use the for loop as follows - note that the for loop is inclusive so you may need to check that len is actually greater than 0:

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

Or you can use this:

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

BTW it appears XCode 7.x does help you to get there but it's a two step process. First you have to change your increment operator from (say) i++ to i += 1 and then XCode warning helps you modify the loop.

Share:
36,453
SNos
Author by

SNos

SALVO NOSTRATO, BORN IN ITALY AND MOVED TO LONDON IN 2005, IS AN INDEPENDENT AND AMBITIOUS INDIVIDUAL DRIVEN BY A PASSION FOR MUSIC, SOUND, PHOTOGRAPHY, AND THE ARTS. HE IS CURRENTLY STUDYING FOR A DEGREE IN “SOUND ARTS AND DESIGN” AT LONDON COLLEGE OF COMMUNICATION. SALVO HAS ALSO STUDIED AT GOLDSMITH UNIVERSITY, LONDON, GAINING A DIPLOMA IN MUSIC PERFORMANCE FOLLOWED BY SOUND ENGINEERING AND MUSIC PRODUCTION DIPLOMA EARNED AT ISLINGTON MUSIC WORKSHOP (IMW), LONDON, UK. BEING A MUSICIAN FROM AN EARLY AGE HE HAS CREATED MUSIC THAT SPANS MANY DIFFERENT GENRES AND HE OWNS A LARGE COLLECTION OF INSTRUMENTS AND RECORDING EQUIPMENT. SALVO’S TECHNICAL KNOWLEDGE HAS ALLOWED HIM TO BUILD HIS OWN HIGH QUALITY STUDIO WHERE HE USES SOFTWARE FOR AUDIO COMPOSITIONS SUCH AS PROTOOLS HD, PROTOOLS LE AND LOGICPRO 9 SUITES IN WHICH HE IS HIGHLY PROFICIENT.

Updated on March 20, 2020

Comments

  • SNos
    SNos about 4 years

    I have update Xcode to 7.3 and now I have a warning to the function that I use to create random strings.

    I have tried to change the for statement with for (i in 0 ..< len){...} however, the warning became an error.

    How can I remove the warning?

    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
    }
    
  • d0ye
    d0ye over 7 years
    it did worked 4 changing the index , seems not work for now :( 4 Changing the index maybe we should replace for loop with a while loop :( like ` var index = 0 while(index < len)`
  • Amr Angry
    Amr Angry about 7 years
    i try this solution but i keep give a warning that idex is never mutated so you should use let instead of var ,but you can't use let in mutate case
  • d0ye
    d0ye about 7 years
    @AmrAngry just for index in stride(from: 0, to: 10, by: 1){} :)
  • Alexander
    Alexander about 6 years
    You should definitely avoid using a where clause in a situation where there is such a clear cut pattern. 0.stride(to: len, by: 2) halves the number of jumps the processor has to do.
  • gman
    gman over 2 years
    when I try the last one I get value of type 'Int' has no member 'stride'