Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 重构开关语句_Swift_Switch Statement_Refactoring_Global Variables - Fatal编程技术网

Swift 重构开关语句

Swift 重构开关语句,swift,switch-statement,refactoring,global-variables,Swift,Switch Statement,Refactoring,Global Variables,有没有办法重构这个函数,让我尽可能少地重复我自己 我有四个ViewController,每个都保存一个变量eventData,它是一个自定义对象 我想让eventData成为一个全局变量。这样做有什么缺点吗 这是我现在正在使用的代码: override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { navigationItem.title = nil let segues = UISto

有没有办法重构这个函数,让我尽可能少地重复我自己

我有四个ViewController,每个都保存一个变量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

    }

}
segues是一个枚举:


是的,您可以拥有具有此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

}

是的,您可以拥有具有此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

}

您可以在设置eventData所需的ViewController上使用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
    }
}

您可以在设置eventData所需的ViewController上使用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
    }
}
给定

定义以下协议

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
        }
    }
}
给定

定义以下协议

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