Swift3迁移问题
问题描述:
四处错误: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
}
答
这里consAry
类型是[NSLayoutConstraint?]
意味着它包含NSLayoutConstraint
类型的optional
对象,并使用for循环,你明确地说,它的类型NSLayoutConstraint
意味着non-optional
,所以要么删除,并在循环里拆开可选值或使用flatMap
在consAry
与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
}
得到错误的最后代码 - 不能分配给值:“i”是一个让恒 –
@ThripthiHaridas删除该行现在有自动循环的价值变化的每一次迭代没有必要。也不需要声明删除行'var i:Int = Int(0)'。 –
@Nirav D谢谢你的回复。节省了我的时间 –