2016-12-27 137 views
1

四处错误:Swift3迁移问题

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

从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 

    } 

回答

2

这里consAry类型是[NSLayoutConstraint?]意味着它包含NSLayoutConstraint类型的optional对象,并使用for循环,你明确地说,它的类型NSLayoutConstraint意味着non-optional,所以要么删除,并在循环里拆开可选值或使用flatMapconsAry与for循环。

选项1:删除有明确的规范循环

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

选项2:使用可选的包装,如果让

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 
} 
+0

得到错误的最后代码 - 不能分配给值:“i”是一个让恒 –

+1

@ThripthiHaridas删除该行现在有自动循环的价值变化的每一次迭代没有必要。也不需要声明删除行'var i:Int = Int(0)'。 –

+1

@Nirav D谢谢你的回复。节省了我的时间 –