Q.1为什么'Any'没有成员'removeFromSuperview'?
Q.2为什么说'AnyObject'为'Any'或者'as!'强制转发为更具体的类型来访问成员?
var allImgViews = [Any]()
viewDidLoad(){
// sample code
for v in 0..<4 {
myImageView.image = UIImage(named: something)
allImgViews.append(myImageView)
}
allImgViews[0].removeFromSuperview()
}
感谢任何帮助
答案 0 :(得分:2)
因为Any
的字面意思是 ANY 数据类型。没有什么要求Any
类型的值必须能够成为能够在视图中添加或删除的视图。 Int
可以是Any
,String
可以是Any
。你会期待这样的事情吗?
let any: Any = 123
any.removeFromSuperView() // What should this call do??? o.0'
因为您只知道您知道该值的类型的值的成员。这就是一种类型:它是通过您可以对它们执行的操作对值进行分类。
在像Swift这样的类型安全语言中,除非您确定执行此操作的值,否则无法执行任何操作。当您知道值的确切类型时,您就可以获得确定性,因为这样您就可以检查该类型是否支持您尝试使用的操作或成员。
首先,没有理由在这里使用Any
。以下是如何用漂亮的特定类型编写它:
var imageViews = [UIImageView]()
func viewDidLoad() {
for v in 0..<4 {
let imageView = UIImageView(frame: CGRect(x: 0 , y: 192, width: 98, height: 94))
imageView.image = UIImage(named: something)
imageViews.append(imageView)
}
imageView[0].removeFromSuperview()
}
如果imageViews
在append
之前的viewDidLoad
来电之前没有值,则可以更好地将此代码写为:
let imageViews = [UIImageView]()
func viewDidLoad() {
imageViews = (0..<4).map { v in
let imageView = UIImageView(frame: CGRect(x: 0 , y: 192, width: 98, height: 94))
imageView.image = UIImage(named: something)
return imageView
}
imageView[0].removeFromSuperview()
}