“Any”类型的值没有成员“removeFromSuperview”

时间:2017-05-01 03:54:47

标签: ios swift xcode uiviewcontroller swift3

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()
     }

感谢任何帮助

1 个答案:

答案 0 :(得分:2)

  1. 因为Any的字面意思是 ANY 数据类型。没有什么要求Any类型的值必须能够成为能够在视图中添加或删除的视图。 Int可以是AnyString可以是Any。你会期待这样的事情吗?

    let any: Any = 123
    any.removeFromSuperView() // What should this call do??? o.0'
    
  2. 因为您只知道您知道该值的类型的值的成员。这就是一种类型:它是通过您可以对它们执行的操作对值进行分类。

    在像Swift这样的类型安全语言中,除非您确定执行此操作的值,否则无法执行任何操作。当您知道值的确切类型时,您就可以获得确定性,因为这样您就可以检查该类型是否支持您尝试使用的操作或成员。

  3. 首先,没有理由在这里使用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()
    }
    

    如果imageViewsappend之前的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()
    }