【问题标题】:Value of type 'Any' has no member 'removeFromSuperview'“任何”类型的值没有成员“removeFromSuperview”
【发布时间】:2017-09-28 13:40:48
【问题描述】:

Q.1 为什么“Any”没有成员“removeFromSuperview”?

Q.2 为什么说将 'Any' 转换为 'AnyObject' 或使用 'as!'强制向下转换为更具体的类型来访问成员?

    var allImgViews = [Any]()
    viewDidLoad(){
     // sample code
     for v in 0..<4 {
      myImageView.image = UIImage(named: something)
      allImgViews.append(myImageView)
     }
      allImgViews[0].removeFromSuperview()
     }

感谢任何帮助

【问题讨论】:

  • 因为Any 的字面意思是any。是什么阻止您将 Int 值 0 放入该数组中,然后尝试调用 removeFromSuperView 呢?程序应该如何决定做什么?
  • myImageView 来自哪里?
  • myImageView 是以编程方式创建的;类似于 let myImageView = UIImageView(frame: CGRect(x: CGFloat(), y: CGFloat(192), width: CGFloat(98), height: CGFloat(94)))
  • @Amrit 而不是var allImgViews = [Any](),您只需使用var allImgViews = [UIImageView]()。所以removeFromSuperview() 会知道allImgViewsUIImageView 的数组,它允许你使用那个方法。
  • @Amrit 不需要CGFloat 构造函数。 CGRect 始终将其成员存储为 CGFloat

标签: ios swift xcode uiviewcontroller swift3


【解决方案1】:
  1. 因为Any 字面意思是ANY 数据类型。没有什么需要Any 类型值才能成为能够从视图中添加或删除的视图。 Int 可以是 AnyString 可以是 Any。你希望这样的事情能做什么?

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

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

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

【讨论】:

  • @Alexander 我们需要在访问第零个索引之前检查 imageViewcount
  • @Jack 不,我们没有,我们只是添加了 4 个项目。我们知道它不是空的
  • @Jack 即使您想避免这种理论上不安全的操作,array.count &gt; 0 也不是正确的做法。 !array.isEmpty 会更好,但最好是使用 array.first,并安全地打开可选
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多