Switch-Case 在 Swift 中使用 Clean Way 进行重构
Switch-Case Refactor in Swift With Clean Way
在这个例子中 DisplayDataItem 协议符合某些 类(即 DisplaySingle)它简单地包含诸如 cellType、标题和类型。 用于显示单个横幅,其他类型也可以是滑块、轮播。
我想将 createBanner() 方法重构为 cleaner-way 而不是 switch-case.
面向协议的方式是做什么的?
public enum DisplayType: String {
case Single = "Single"
func value() -> String {
return self.rawValue
}
}
protocol DisplayDataItem {
var cell: DisplayCellType { get }
var title: String { get }
var displayType: DisplayType { get }
}
final class ViewModel: NSObject {
private(set) var banner: Banner?
var item: DisplayDataItem?
init(banner: Banner? = nil) {
super.init()
self.banner = banner
}
public func createBanner() -> DisplayDataItem {
var item: DisplayDataItem?
if let banner = banner {
let displayType = DisplayType(rawValue: banner.displayType ?? "Single")
switch displayType {
case .Banner:
item = DisplaySingle(banner: banner)
case .Slider:
item = DisplaySlider(banner: banner)
case .none:
break
}
}
return item
}
你可以这样做:
extension DisplayType {
var displayDataItem: DisplayDataItem? {
switch self {
case .Banner:
return DisplaySingle(banner: banner)
case .Slider:
return DisplaySlider(banner: banner)
case default:
return nil
}
}
}
然后将您的 createBanner
函数更改为:
public func createBanner() -> DisplayDataItem? {
guard let banner = banner else { return nil }
let displayType = DisplayType(rawValue: banner.displayType ?? "Single")
return displayType.displayDataItem
}
你的代码没有编译,所以你需要做一些调整,但你明白我的意思了。
我不明白你的代码。
不过你的意图多少有点被理解了。
我会将getItem
方法变成DisplayType
public enum DisplayType: String {
case single = "Single"
case slider = "Slider"
}
extension DisplayType {
func getItem(_ banner: Banner) -> DisplayDataItem {
switch self {
case .single:
return DisplaySingle(banner: banner)
case .slider:
return DisplaySlider(banner: banner)
}
}
}
我假设 ViewModel
有 Banner?
、DisplayDataItem?
和 Banner
对象有 DisplayType
public func createBanner() -> DisplayDataItem? {
self.item = self.banner?.displayType.getItem(banner)
return self.item
}
在这个例子中 DisplayDataItem 协议符合某些 类(即 DisplaySingle)它简单地包含诸如 cellType、标题和类型。 用于显示单个横幅,其他类型也可以是滑块、轮播。
我想将 createBanner() 方法重构为 cleaner-way 而不是 switch-case.
面向协议的方式是做什么的?
public enum DisplayType: String {
case Single = "Single"
func value() -> String {
return self.rawValue
}
}
protocol DisplayDataItem {
var cell: DisplayCellType { get }
var title: String { get }
var displayType: DisplayType { get }
}
final class ViewModel: NSObject {
private(set) var banner: Banner?
var item: DisplayDataItem?
init(banner: Banner? = nil) {
super.init()
self.banner = banner
}
public func createBanner() -> DisplayDataItem {
var item: DisplayDataItem?
if let banner = banner {
let displayType = DisplayType(rawValue: banner.displayType ?? "Single")
switch displayType {
case .Banner:
item = DisplaySingle(banner: banner)
case .Slider:
item = DisplaySlider(banner: banner)
case .none:
break
}
}
return item
}
你可以这样做:
extension DisplayType {
var displayDataItem: DisplayDataItem? {
switch self {
case .Banner:
return DisplaySingle(banner: banner)
case .Slider:
return DisplaySlider(banner: banner)
case default:
return nil
}
}
}
然后将您的 createBanner
函数更改为:
public func createBanner() -> DisplayDataItem? {
guard let banner = banner else { return nil }
let displayType = DisplayType(rawValue: banner.displayType ?? "Single")
return displayType.displayDataItem
}
你的代码没有编译,所以你需要做一些调整,但你明白我的意思了。
我不明白你的代码。 不过你的意图多少有点被理解了。
我会将getItem
方法变成DisplayType
public enum DisplayType: String {
case single = "Single"
case slider = "Slider"
}
extension DisplayType {
func getItem(_ banner: Banner) -> DisplayDataItem {
switch self {
case .single:
return DisplaySingle(banner: banner)
case .slider:
return DisplaySlider(banner: banner)
}
}
}
我假设 ViewModel
有 Banner?
、DisplayDataItem?
和 Banner
对象有 DisplayType
public func createBanner() -> DisplayDataItem? {
self.item = self.banner?.displayType.getItem(banner)
return self.item
}