2017-10-18 10 views
1

isKind(of:)メソッドを使用してUIViewのタイプがUIImageViewであるかどうかを確認します。isKind(of:..)でオブジェクトタイプをチェックするにはどうすればいいですか?

しかしswift 4コンパイラは私にエラーを与える:

Expected member name or constructor call after type name

私はそれで間違っているかを把握することはできません。それはObjective-Cのタイプをチェックして、その仕事をしていませんが、

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

ているので、あなたはUIViewにキャストする必要はありません。あなたのタイプの注釈はそれをずっと悪化させます。 – vadian

+0

@vadianええ。私は定義に行き、 'open var subviews:[UIView] {get}'を見つけてください。ありがとう – novaline

答えて

2

は一般的に、isKind(of:)as?単純またはisスウィフトオペレータの賛成で避けるべきです。だから、このコード(訂正):

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

全体の方法を簡単に置き換えることができEDIT

::ちょうど

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

それは動作します。しかし、なぜ 'UIImageView.self'ですか?これはobj-cの方法ですか? – novaline

+1

'UIImageView.self'は、' isKindOfClass'メソッド自体と同様にObjective-Cに由来する '[UIImageView class]'と同等です。これはネイティブスイフト法ではありません。 Objective-CからSwiftに来て、NSObjectから派生したオブジェクトをチェックしました。スウィフト 'as'と' is'演算子は基本的にオブジェクトの型をチェックするのと同じ仕事をします。 – Hexfire

+1

nil coalescing演算子は冗長で、条件に一致するものがなければ 'first'は' nil'を返します。 – vadian

2

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

はに相当しますis演算子を使用します。 subviewsは `[UIViewの]`返しsubviews` `UIViewさん

func viewForZooming(in scrollView: UIScrollView) -> UIView? { 
    for subview in scrollView.subviews { 
     if subview is UIImageView { 
      return subview 
     } 
    } 
    return nil 
} 
関連する問題