【问题标题】:Swift3 Migration issuesSwift3 迁移问题
【发布时间】:2016-12-27 06:41:26
【问题描述】:

得到错误:

表达式类型 '[NSLayoutConstraint?]' 在没有更多上下文的情况下是模棱两可的”

从 Swift2.2 迁移到 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

    }

【问题讨论】:

    标签: swift swift3 nslayoutconstraint


    【解决方案1】:

    这里的consAry 类型是[NSLayoutConstraint?] 表示它包含optional 类型为NSLayoutConstraint 的对象,并且使用for 循环您明确将其类型告诉NSLayoutConstraint 表示non-optional,所以要么删除它并在里面循环解开可选值或在 consAry 上使用 flatMap 和 for 循环。

    选项 1:使用 for 循环删除显式规范

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

    选项 2:使用 if let 的可选包装

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

    选项 3:在 consAry 上使用 flatMap

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

    注意:您在此处使用i 进行索引,因此请使用带有for 循环的enumerated()

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

    【讨论】:

    • 最后一个代码出错-无法赋值:'i'是一个让常量
    • @ThripthiHaridas 删除该行现在不需要在循环的每次迭代中自动更改其值。也不需要声明删除行var i : Int = Int(0)
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 2014-11-23
    • 2018-11-27
    • 2021-11-20
    • 2015-01-04
    • 2011-10-26
    • 2019-08-12
    相关资源
    最近更新 更多