Strange Behaviour in Swift: constant defined with LET but behaving like a variable defined with VAR

Posted by Sam on Stack Overflow See other posts from Stack Overflow or by Sam
Published on 2014-08-24T15:58:56Z Indexed on 2014/08/24 16:20 UTC
Read the original article Hit count: 284

Filed under:
|

Stuck on the below for a day! Any insight would be greatly appreciated. The constant in the first block match0 behaves as expected. The constant defined in the second block does not behave as nicely in the face of a change to its "source":

var str = "+y+z*1.0*sum(A1:A3)"

if let range0 = str.rangeOfString("^\\+|^\\-|^\\*|^\\/", options: NSStringCompareOptions.RegularExpressionSearch){

    let match0 = str[range0]
    println(match0) //yields "+" - as expexted

    str.removeRange(range0)
    println(match0) //yields "+" - as expected

    str.removeRange(range0)
    println(match0) //yields "+" - as expected
}

if let range1 = str.rangeOfString("^\\+|^\\-|^\\*|^\\/", options: NSStringCompareOptions.RegularExpressionSearch){
    let match1 = str[range1]
    println(match1) //yields "+" as expected
    str.removeRange(range1)
    println(match1) //!@#$ OMG!!!!!!!!!!! a constant variable has changed! This prints "z"
}

The following are the options I can see:

  1. match1 has somehow obtained a reference to its source instead of being copied by value [Problem: Strings are value types in Swift]

  2. match1 has somehow obtained a closure to its source instead of just being a normal constant/variable? [Problem: sounds like science fiction & then why does match0 behave so well?]

  3. Could there be a bug in the Swift compiler? [Problem: Experience has taught me that this is very very very rarely the solution to your problem...but it is still in beta]

© Stack Overflow or respective owner

Related posts about reference

Related posts about swift