2014-10-06 20 views
2

目前我的雨燕代码应该是显而易见下面的代码片段是功能:Can Swift Generics可以帮助一个函数根据类来处理不同的参数吗?

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) 
    } 

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

+0

什么叫'loadPage',怎么样? – user2864740 2014-10-06 02:19:23

+0

我从外部类调用loadPage,但它只是一个实验,能够传递任何对象并相应地从单个公共方法处理它,而不会暴露私有函数。 – coneybeare 2014-10-06 02:24:14

+1

如果创建*多个*类型(读取:类),每个处理特定的*类型*的“页面”,则可以使用泛型。然后,仍然有基于实际的“页面”类型选择正确的实现(并输入表达式)的过程。我可能会公开不同的方法和/或要求调用者在这种情况下预先做更多的工作。其他模式(例如,不同的服务/工厂/查找)在更大的“企业”代码中变得相关,但也使可能是简单的代码复杂化。 – user2864740 2014-10-06 02:25:34

回答

1

这不是泛型的好用例,因为您希望在调用loadPage()时允许的三种类型不能真正以相同的方式处理。当一组类型共享一个特定属性或行为(如ComparableSequenceType)时,会使用一种通用方法,但在此您需要专门分支以便处理每种类型的差异。

如果您的私人loadRequest()方法有多个过载的loadPage()实现会更好 - 这样您将进行类型检查,并且将清楚支持哪些类型作为“页面类型”。

相关问题