Swift Generics可以帮助函数根据类不同地处理参数吗?

时间:2014-10-06 01:44:25

标签: optimization swift generics

我提供了以下Swift代码片段,显而易见的是函数:

    func loadPage(page: AnyObject) {
        if page is String {
            loadRequest(page as String)
        } else if page is NSURL {
            loadRequest(page as NSURL)
        } else if page is NSURLRequest {
            loadRequest(page as NSURLRequest)
        } else {
            assertionFailure("Unsupported page type")
        }
    }

    private func loadRequest(string: String) {
        loadRequest(NSURL(string: string))
    }

    private func loadRequest(url: NSURL) {
        loadRequest(NSURLRequest(URL: url))
    }

    private func loadRequest(request: NSURLRequest) {
        webView.loadRequest(request)
    }

我试图围绕Generics的力量,并试图找出一种方法,可以使用泛型类型缩短此片段,但我不确定这将适用于此处的单一模式AnyObject接受通过is/as比较运行该对象的函数。我错了吗?

1 个答案:

答案 0 :(得分:1)

对于泛型来说,这不是一个很好的用例,因为在loadPage()的调用中您想要允许的三种类型无法以相同的方式处理。当一组类型共享特定属性或行为(例如ComparableSequenceType)时,会使用通用方法,但此处您专门进行分支,以便您可以处理每种类型&#39差异。

让多个重载的loadPage()实施与您的私有loadRequest()方法相匹配会更好 - 这样您就可以进行类型检查,并且它会清楚哪个类型支持为"页面类型"。