ios - Swift - 无法将函数转换为泛型

标签 ios swift

我想要一个返回给定泛型类的第一个 subview 的泛型函数。在这一点上,我认为这是不可能的,但我想确定一下。下面是我想制作通用的函数,并且能够替换作为 UIView 的子项并响应#subviews 的任何项目。

这适用于 ScrollView

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

这会编译并运行,但会找到 View 。

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 语句,但感觉不对。

最佳答案

这似乎可行:

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

关于ios - Swift - 无法将函数转换为泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874738/

相关文章:

ios - UITableView 滚动时崩溃(iOS 7.1.2)

ios - CGAffineTransform:如何计算乘法CGAffineTransform?

ios - 改变 UIView 相对于 UITableview 的高度

ios - 从 iOS 应用程序打开 Telegram 聊天(使用机器人)

ios - Sprite Kit - 将 body 滑过其他人

ios - 在 URL 查询中使用俄语字符

Swift 闭包 - 强制闭包始终完成

ios - 从Google Drive Swift下载Sqlite文件

iphone - 将 UIPickerView 和 UIToolBar 添加到 UIActionSheet 的问题

swift - 使用来自 RLMResults.Observe() 的多个部分更新 UITableView