Swift -在将函数转换为泛型时遇到麻烦



我想要一个返回给定泛型类的第一个子视图的泛型函数。在这一点上,我不认为这是可能的,但我想确保。下面是我想让通用的功能,并能够替代任何项目,是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是一个元类型,我不能让它显示一个类。我想我可以扩展我想要搜索的类,并添加一个描述,并在字符串上做一个开关语句,但感觉不对。

这似乎可以工作:

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

最新更新