我提供了以下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
比较运行该对象的函数。我错了吗?
答案 0 :(得分:1)
对于泛型来说,这不是一个很好的用例,因为在loadPage()
的调用中您想要允许的三种类型无法以相同的方式处理。当一组类型共享特定属性或行为(例如Comparable
或SequenceType
)时,会使用通用方法,但此处您专门进行分支,以便您可以处理每种类型&#39差异。
让多个重载的loadPage()
实施与您的私有loadRequest()
方法相匹配会更好 - 这样您就可以进行类型检查,并且它会清楚哪个类型支持为"页面类型"。