我想要一个返回给定泛型类的第一个子视图的泛型函数。在这一点上,我不认为这是可能的,但我想确定。下面是我想要通用的函数,并且能够替换任何UIView的子项并响应#subviews。
这适用于ScrollViews
// Returns first UIScrollView in subviews of view
func searchFor(view: UIView) -> UIScrollView? {
for v in view.subviews{
let y = v as UIView
if v is UIScrollView {
return (v as UIScrollView)
}
}
return nil
}
我希望如果我传递了一个我正在搜索的对象类型的实例,我可以派生出类类型并使用它:
if v is T
编译并运行但确实找到了视图。
func searchFor<T>(view: UIView, t: T) -> T? {
for v in view.subviews {
println(v.self)
println("Looking in view")
if v is T {
println("Found in searchFor<T>")
return (v as T)
}
}
return nil
}
T是一个元类型,我不能让它显示一个类。我想我可以扩展我想要搜索的类并添加描述并对字符串执行switch语句,但感觉不对。
答案 0 :(得分:2)
这似乎有效:
extension Array {
func firstOfType<X: AnyObject>(c: X.Type) -> X? {
for x in self {
if x is X { return (x as X) }
}
return nil
}
}
var v = UIView()
v.addSubview(UIView())
v.addSubview(UIScrollView())
v.addSubview(UIButton())
v.addSubview(UIControl())
v.subviews.firstOfType(UIControl) // returns the UIButton
或替代方案:
extension Array {
func firstWhere(returnElement: T -> Bool) -> T? {
var g = lazy(self).filter(returnElement).generate()
return g.next()
}
}
v.subviews.firstWhere { $0 is UIControl } // returns the UIButton