2016-07-06 18 views
1

我有一个NSViewController延伸穿过它的所有后代子视图控制器迭代寻找可通过特定测试(由用户定义的块中指定)所述第一视图控制器:搜索匹配特定类型的对象

我的测试由一个简单的类型检查的时间
extension NSViewController { 

    func descendantViewControllerPassingTest(test: (viewController: NSViewController) -> Bool) -> NSViewController? { 
     var retval: NSViewController? 
     for childViewController in childViewControllers { 
      if test(viewController: childViewController) { 
       retval = childViewController 
      } else if let descendantViewController = viewController.descendantViewControllerPassingTest(test) { 
       retval = descendantViewController 
      } 
      if retval != nil { break } 
     } 
     return retval 
    } 
} 

百分之九十九......

contentViewController.descendantViewControllerPassingTest {$0 is OutlineViewController} 

...所以我想创建一个简短的方便扩展,这样处理:

extension NSViewController { 
    func descendantViewControllerMatchingType(type: WHAT_HERE?) { 
     return descendantViewControllerPassingTest({ $0 is WHAT_HERE? }) 
    } 
} 

但我无法制定出什么type我的参数类型应该是。我试过AnyClassAnyObject但编译器告诉我,这些都不类型:

enter image description here

+0

我对泛型没有多少经验,但我认为对泛型的理解是正确的方向。我想你可以使用泛型类型。但正如我所说,我没有足够的经验来提供更多帮助。 – Andrej

回答

0

Closures就是我想要的使用。将返回类型为BOOL的对象传递给闭包。使用闭包递归地匹配你的后代。

相关问题