2017-05-01 33 views
0

問題1爲什麼「任何」沒有成員「removeFromSuperview」?值類型的「任意」沒有成員「removeFromSuperview」

Q.2爲什麼沒有說投「任何」到「AnyObject」或使用「作爲!」強制向下轉換爲更具體的類型以訪問成員?

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

任何幫助理解

+1

因爲'Any'字面意思'any'。什麼是阻止你把'Int'值0放在那個數組中,然後試着對它調用'removeFromSuperView'?該計劃應該如何決定該怎麼做? – Alexander

+0

'myImageView'從哪裏來? – Alexander

+0

myImageView以編程方式創建;類似的東西,以讓myImageView =的UIImageView(幀:的CGRect(X:CGFloat的()中,Y:CGFloat的(192),寬:CGFloat的(98),高度:CGFloat的(94))) – Amrit

回答

2
  1. 由於Any字面意思ANY數據類型。沒有什麼需要Any類型的值必須能夠成爲可以添加或從視圖中刪除的視圖。 Int可以是AnyString可以是Any。你會期待這樣的事情嗎?

    let any: Any = 123 
    any.removeFromSuperView() // What should this call do??? o.0' 
    
  2. 因爲您只知道值的成員的類型,您知道該值。這就是一種類型:它是通過您可以對它們執行的操作對值進行分類。

    在像雨燕一種類型安全的語言,你不能執行,除非你確認值的任何操作你這樣做,以支持該操作。當你知道確切類型的值時,你就會獲得確定性,因爲那樣你就可以檢查該類型是否支持你正在嘗試使用的操作或成員。

沒有理由在這裏首先使用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() 
} 

如果imageViewsviewDidLoadappend調用之前沒有值,這個代碼可以更好的寫法如下:

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

明白了。修正了任何UIView和它的伎倆。乾杯 – Amrit

+0

@Alexander我們需要訪問第零指數 – Jack

+0

@Jack沒有前檢查imageViewcount我們不這樣做,我們只是增加了4項吧。我們知道它不是空的 – Alexander

相關問題