2016-09-22 29 views
2

我以前能夠通過向數組添加多個視圖(UIImageViews,UILabels和UIButtons)來清理我的代碼,然後遍歷數組來更改屬性這樣的:Swift 3 - 在視圖陣列上設置屬性

var hideViews = [imageView1, imageView2, label1, button1, button2] 
     for eachView in hideViews { 
      eachView.isHidden = true 
     } 

然後在斯威夫特的另一個版本變成了:

var hideViews = [imageView1, imageView2, label1, button1, button2] as [Any] 
     for eachView in hideViews { 
      (eachView as AnyObject).isHidden = true 
     } 

我也可以用這個來一次移動幾個觀點:

for view in viewsToMove { 
    (view as AnyObject).frame = CGRect(x: view.frame.origin.x - 30, y: view.frame.origin.y, width: view.frame.width, height: view.frame.height) 
} 

我現在正在收到錯誤:

無法分配給'Bool!'類型的不可變表達式。

無法分配給'CGRect!'類型的不可變表達式。

有沒有人知道我在這裏錯過了什麼,爲了在Swift 3中做到這一點?

謝謝!

+1

爲什麼不只是限定陣列'VAR hideViews:[UIView的] = [imageView1,imageView2,label1的,按鈕1,按鈕2]'? – Hamish

回答

1

isHiddenframeUIView類的屬性,所以如果你想更新屬於它們的屬性,你不應該將它們轉換成AnyObject。只要做到:

let views: [UIView] = [imageView1, imageView2, label1, button1, button2] 

for view in views { 
    view.isHidden = true 
    view.frame = CGRect(x: ..., y: ...) 
} 
+0

謝謝你是第一個回答並指出數組應該是[UIView]而不是[Any]的情況,而這最終是這裏的問題。我還要指出.isHidden的適當的Swift 3代碼,而不是.hidden,但是你已經更新了你的答案。將此標記爲答案,但我也可以將我的代碼更新爲下面的@appzYourLife答案。我不喜歡在我的代碼中使用$ 0,但我喜歡遍歷數組的迭代器的.forEach結構。 – RanLearns

3

鑑於UIView

let hideViews: [UIView] = ... 

數組你可以隱藏每個視圖

hideViews.forEach { $0.isHidden = true } 

移動每個視圖30分至左側

hideViews.forEach { $0.frame.origin.x -= 30 } 

兩者

hideViews.forEach { 
    $0.isHidden = true 
    $0.frame.origin.x -= 30 
} 
+0

感謝您指出使用.forEach遍歷數組的能力 - 這是保留在編碼工具箱中的有用速記! – RanLearns

+0

也更清潔,以更新frame.origin.x值而不是完整的CGRect框架,因爲我正在做我的問題。再次感謝! – RanLearns

0

你並不需要強制強制轉換爲任何或AnyObject。 這項工作對於Swift3:

let v = UIView() 
let i = UIImageView() 
let l = UILabel() 
let b = UIButton() 

// Swift auto infers array type, this is equal to write 
// let views: [UIView] = [v, i, l, b] 
let views = [v, i, l, b] 


views.forEach { 
    $0.isHidden = true 
} 

//or 

for view in views { 
    view.frame = CGRect.zero 
}