2016-11-16 5 views
0

Я пытаюсь перевести следующий код в Swift 3. Я чувствую, что другие плакаты ответили на это, но я не могу понять это.Swift 3 Iterate Over Array of Classes

- (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; 
} 

Вот что я до сих пор:

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 и говорит: "Использование необъявленной типа ClassType. Что здесь происходит?

ответ

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: _), похоже, использует динамическую отправку для разрешения типа экземпляра. –