2016-02-23 59 views
0

有没有一种方法来重构这个函数,以尽可能少的方式重复我的自我?重构开关 - 语句

我有四个ViewControllers,每个ViewControllers拥有一个变量eventData这是一个自定义对象。

我想过让eventData成为一个全局变量。这样做有什么缺点吗?

这是我使用的是现在的代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    navigationItem.title = nil 

    let segues = UIStoryboardSegue.Segue.self 

    switch segue.identifier! { 

    case segues.EventOverviewToGuestList.rawValue: 

     let destinationVC = segue.destinationViewController as! GuestListVC 

     destinationVC.eventData = eventData 


    case segues.EventOverviewToAnalytics.rawValue: 

     let destinationVC = segue.destinationViewController as! AnalyticsVC 

     destinationVC.eventData = eventData 


    case segues.EventOverviewToMessaging.rawValue: 

     let destinationVC = segue.destinationViewController as! MessagingVC 

     destinationVC.eventData = eventData 


    case segues.EventOverviewToInformation.rawValue: 

     let destinationVC = segue.destinationViewController as! InformationVC 

     destinationVC.eventData = eventData 

    default: break 

    } 

} 

seguesenum

extension UIStoryboardSegue { 

    enum Segue : String 
    { 

     case EventListToEventOverview 
     case EventOverviewToGuestList 
     case EventOverviewToAnalytics 
     case EventOverviewToMessaging 
     case EventOverviewToInformation 

    } 

} 

回答

2

是的,你可以有一个具有此EVENTDATA成员的基类。让我们假设 -

class BaseViewController : UIViewController{ 
    var eventData : SomeCustomClass? 
} 

并导出所有需要事件数据的视图控制器。现在

class InformationVC : BaseViewController{ 
} 

class AnalyticsVC : BaseViewController{ 
} 

class GuestListVC:BaseViewController{ 
} 

的情况下,可以结合:

switch segue.identifier! { 

    case segues.EventOverviewToGuestList, 
    segues.EventOverviewToAnalytics, 
    segues.EventOverviewToMessaging, 
    segues.EventOverviewToInformation: 

    let destinationVC = segue.destinationViewController as! BaseViewController 
    destinationVC.eventData = eventData 

    default: break 

} 
1

你可以在你需要设置EVENTDATA的ViewControllers使用EventDataProtocol。任何使用EventDataProtocol的视图控制器都会有Segue设置的eventData。例如:

protocol EventDataProtocol { 
    var eventData: Int? { get set } //Change to your actual type 
} 

class EventData: UIViewController, EventDataProtocol { 
    var eventData: Int? 
} 

,然后在prepareForSegue方法:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    super.prepareForSegue(segue, sender: sender) 

    if var eventDataVC = segue.destinationViewController as? EventDataProtocol { 
     eventDataVC.eventData = 5 
    } 
} 
1

鉴于

struct EventData {} 

定义以下协议

protocol Module0 { var eventData: EventData? { get set } } 

并符合它的视图控制器

class GuestListVC: UIViewController, Module0 { var eventData: EventData? } 
class AnalyticsVC: UIViewController, Module0 { var eventData: EventData? } 
class MessagingVC: UIViewController, Module0 { var eventData: EventData? } 
class InformationVC: UIViewController, Module0 { var eventData: EventData? } 

属性添加到您的枚举现在

extension UIStoryboardSegue { 

    enum Segue: String { 
     case EventListToEventOverview 
     case EventOverviewToGuestList 
     case EventOverviewToAnalytics 
     case EventOverviewToMessaging 
     case EventOverviewToInformation 

     static var allRawValues: [String] { 
      return 
       [ 
        Segue.EventListToEventOverview.rawValue, 
        Segue.EventOverviewToGuestList.rawValue, 
        Segue.EventOverviewToAnalytics.rawValue, 
        Segue.EventOverviewToMessaging.rawValue, 
        Segue.EventOverviewToInformation.rawValue 
      ] 
     } 
    } 

} 

这是非常简单的

class ViewController: UIViewController { 
    var eventData = EventData() 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     navigationItem.title = nil 

     if var destinationVC = segue.destinationViewController as? protocol<Module0> where UIStoryboardSegue.Segue.allRawValues.contains(segue.identifier!) { 
      destinationVC.eventData = eventData 
     } 
    } 
}