2015-06-10 41 views
2

我有以下代碼,試圖創建約束的陣列以添加到視圖:「+ =」不能被應用到兩個[AnyObject]操作數

let views = ["button": button] 
let metrics = ["margin": 16] 

var constraints: [AnyObject] = [] 
constraints += NSLayoutConstraint.constraintsWithVisualFormat("|-margin-[button]-margin-|", options: 0, metrics: metrics, views: views) 

從我明白關於SWIFT陣列,我應該能夠「+ =」他們共同參加了兩下,但我得到一個錯誤:

"Binary operator '+=' cannot be applied to two [AnyObject] operands"

有什麼不對的代碼?

+0

你使用的是什麼版本的Xcode?現在一個關鍵的問題 - 在兩天前發佈的Xcode 7中發生了很大的變化,就像這個評論一樣。 – dpassage

+0

Xcode 6.3.2是我正在做的。 – gdavis

回答

4

這不是因爲操作員。 這是因爲你傳遞了一個Int,你實際上應該通過NSLayoutFormatOptions枚舉類型。

如果在NSLayoutFormatOptions枚舉爲options參數之一傳遞,錯誤就會消失:

constraints += NSLayoutConstraint.constraintsWithVisualFormat("|-margin-[button]-margin-|", options: .AlignAllLeft, metrics: metrics, views: views) 

或者你也可以用你想使用的int值初始化NSLayoutFormatOptions,這樣:

NSLayoutFormatOptions(rawValue: 0) 

0將在Objective-C已經工作,但您需要使用雨燕的實際枚舉值。 Swift錯誤在許多情況下仍然經常誤導,就像這個。

希望這會有所幫助。

+0

我剛剛得出這個結論。 Xcode編譯器讓我跑了圈,告訴我錯誤的錯誤... – gdavis

+0

是的..希望Xcode將提供更多有用的錯誤解釋不久:) – Dennis

0

我想你可以嘗試將constraintsWithVisualFormat的結果保存到一個臨時常量中,然後分配它。

let newConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|-margin-[button]-margin-|", options: 0, metrics: metrics, views: views) 
constraints += newConstraints 
+0

原來這是導致錯誤的格式選項枚舉。 Xcode只是做了一個很好的工作,說錯誤是什麼...... – gdavis

0

這裏的答案:

Xcode中列出了錯誤的事情的錯誤,這是什麼導致了這一切的混亂。對我的格式選項使用Int的Int顯然不會使編譯器感到高興,所以我不得不使用NSLayoutFormatOptions(0)

就這樣,在完成工作的代碼是這樣的:

var constraints: [AnyObject] = [] 
constraints += NSLayoutConstraint.constraintsWithVisualFormat("|-margin-[button]-margin-|", options: NSLayoutFormatOptions(0), metrics: metrics, views: views) 
0

在我的情況下使用.AlignAllLeft代替NSLayoutFormatOptions(rawValue: 0)是造成不了什麼錯誤。約束數組應該是靜態類型的。

// BEFORE: 
// var viewConstraints: [AnyObject] = [AnyObject]() 
// AFTER: 
var viewConstraints: [NSLayoutConstraint] = [NSLayoutConstraint]() 
let views = NSDictionary(object: customView, forKey: "customView") 

viewConstraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[customView]|", 
    options: NSLayoutFormatOptions(rawValue: 0), 
    metrics: nil, 
    views: views as! [String : AnyObject]) 

// "Convert to Swift 2.0" Xcode option suggests syntax: 
viewConstraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[customView]|", 
    options: [], 
    metrics: nil, 
    views: views as! [String : AnyObject]) 

這看起來不錯,因爲我想要「無選項」的價值。

相關問題