2016-11-16 75 views
0

我想将下面的代码翻译成Swift 3.我觉得其他海报已经回答了这个问题,但我似乎无法弄清楚。Swift 3迭代类数组

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

这似乎工作。任何想法为什么'是'没有工作 - 或者是KindOf真的有什么区别? – Alex

+0

也许它与桥接有关。 .kind(of:_)好像使用动态分派来解析实例的类型。 –