Search code examples
swiftswift3nslayoutconstraint

Swift3 Migration issues


Getting error:

Expression type '[NSLayoutConstraint?]' is ambiguous without more context"

After migrating from Swift2.2 to Swift3.

    let consAry = [emailBottom,pwrdBottom]

    var i : Int = Int(0)
    for constraint: NSLayoutConstraint in consAry {
        if ((i > 2) && (screenHeight <= 568)){
            padding = 10
        }
        constraint.constant = padding
        i = i + 1

    }

Solution

  • Here type of consAry is [NSLayoutConstraint?] means it contains optional object of type NSLayoutConstraint and with for loop you are explicitly saying its type to NSLayoutConstraint means non-optional, so either remove that and inside the loop unwrapped the optional value or use flatMap on consAry with for loop.

    Option 1: Remove explicit specification with for loop

    for constraint in consAry {
        if ((i > 2) && (screenHeight <= 568)){
            padding = 10
        }
        constraint?.constant = padding        
        i = i + 1
    }
    

    Option 2: Optional Wrapping using if let

    for constraint in consAry {
        if ((i > 2) && (screenHeight <= 568)){
            padding = 10
        }
        if let currentConstraint = constraint {
            currentConstraint.constant = padding
        }
        i = i + 1
    }
    

    Option 3: Use flatMap on consAry

    for constraint in consAry.flatMap ({ $0 }) {
        if ((i > 2) && (screenHeight <= 568)){
            padding = 10
        }
        constraint.constant = padding
        i = i + 1
    }
    

    Note: You are using i for indexing here, so instead of that use enumerated() with for loop.

    for (i, constraint) in consAry.flatMap ({ $0 }).enumerated() {
        if ((i > 2) && (screenHeight <= 568)){
            padding = 10
        }
        constraint.constant = padding
    }