2016-11-16 13 views
0

次のコードをSwift 3に翻訳しようとしています。私は他のポスターがこれに答えたように感じますが、わかりません。 classTypeに両方の参照にSwift 3クラスの配列全体を繰り返します

func allowTouchForSubview(subview: UIView) -> Bool { 
    let allowedClasses: [AnyClass] = [UITextField.self, UISearchBar.self, UITextView.self] 
    for classType in allowedClasses { 
     if subview is classType { 
      return true 
     } 
     if let superview = subview.superview { 
      if superview is classType { 
       return true 
      } 
     } 
    } 
    return false 
} 

このエラーと「宣言されていないタイプのClassTypeの使用」と言っ:

- (BOOL)allowTouchForSubview:(UIView *)subview { 
    NSArray *classes = @[[UITextField class], [UISearchBar class], [UITextView class]]; 
    for (Class class in classes) { 
     if ([subview isKindOfClass:class]) { 
      return YES; 
     } 
     if ([subview.superview isKindOfClass:class]) { 
      return YES; 
     } 
    }; 
    return NO; 
} 

は、ここで私がこれまで持っているものです。ここで何が起こっているのですか?

答えて

2

これを試してみてください:

func allowTouchForSubview(subview: UIView) -> Bool { 
     let allowedClasses: [AnyClass] = [UITextField.self, UISearchBar.self, UITextView.self] 

    for classType in allowedClasses { 
     if subview.isKind(of: classType) || (subview.superview?.isKind(of: classType) ?? false) { 
      return true 
     } 
    } 
    return false 
} 

テストに:

let test = UITextView() 
allowTouchForSubview(subview: test)//prints true 

let textField = UITextField() 
allowTouchForSubview(subview: textField)//prints true 


let subview = UIView() 
allowTouchForSubview(subview: subview) //prints false 
test.addSubview(subview) 
allowTouchForSubview(subview: subview) //prints true 
+0

これが動作しているように見えます。なぜ「is」のアイディアが動作していないか、またはisKindOfが実際にやっていることの違いは何ですか? – Alex

+0

おそらくそれはブリッジングと関係があります。 .kind(of:_)は、インスタンスの型を解決するために動的ディスパッチを使用しているようです。 –

関連する問題