Swift 重构开关语句
有没有办法重构这个函数,让我尽可能少地重复我自己 我有四个ViewController,每个都保存一个变量eventData,它是一个自定义对象 我想让eventData成为一个全局变量。这样做有什么缺点吗 这是我现在正在使用的代码: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
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
}
}
}