2016-09-22 25 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 
}