2016-12-27 204 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謝謝你的回覆。節省了我的時間 –