2017-10-18 696 views
1

我使用isKind(of:)方法來檢查UIView是否爲UIImageView類型。如何使用isKind(of:)檢查對象類型?

swift 4編譯器給我一個錯誤:

Expected member name or constructor call after type name

我想不出有什麼地方錯了。

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    for subview: AnyObject in scrollView.subviews { 
     if subview.isKind(of: UIImageView) { //<-Expected member name or constructor call after type name 
      return subview as? UIView 
     } 
    } 
    return nil 
} 
+0

'subviews'返回'[UIView的]'。您的類型註釋使其變得更糟。 – vadian

+0

@vadian是啊。我進入定義,找到'open var subviews:[UIView] {get}'。謝謝 – novaline

回答

2

一般來說,雖然它確實它在檢查的Objective-C類型的工作,isKind(of:)應該贊成簡單as?is斯威夫特運營商的避免。所以這個代碼(校正):

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    for subview in scrollView.subviews { 
     if subview.isKind(of: UIImageView.self) { 
      return subview 
     } 
    } 
    return nil 
} 

將相當於:

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    return scrollView.subviews.first(where: {$0 is UIImageView }) ?? nil 
} 
+0

它的工作原理。但爲什麼'UIImageView.self'?這是一種obj-c方式嗎? – novaline

+1

'UIImageView.self'等同於'[UIImageView class]',它來自Objective-C,就像'isKindOfClass'本身一樣。這不是一個本地的Swift方法。它來自Objective-C的Swift來檢查派生自NSObject的對象。 Swift'as'和'''操作符基本上完成了檢查對象類型的工作。 – Hexfire

+1

零合併運算符是多餘的,如果沒有任何條件匹配,「first」返回「nil」。 – vadian

2

只是:

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    for subview in scrollView.subviews { 
     if subview is UIImageView { 
      return subview 
     } 
    } 
    return nil 
} 

EDIT

整個方法可以很容易地被替換使用is運算符。而你並不需要轉換爲UIView,因爲subviewsUIView

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    for subview in scrollView.subviews { 
     if subview is UIImageView { 
      return subview 
     } 
    } 
    return nil 
}