Swift3 迁移问题

Posted

技术标签:

【中文标题】Swift3 迁移问题【英文标题】:Swift3 Migration issues 【发布时间】: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

    

【问题讨论】:

【参考方案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)

以上是关于Swift3 迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用在导航期间迁移到 swift3 后崩溃

Swift 3.0 xCode 8 迁移吊舱

“无下标成员”错误(迁移到 Swift 3)

swift 3 迁移后 NSPredicate 崩溃

迁移到 Swift 3.0,构建问题

Swift 3 迁移详解