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

我假设 ViewModelBanner?DisplayDataItem?Banner 对象有 DisplayType

public func createBanner() -> DisplayDataItem? {
  self.item = self.banner?.displayType.getItem(banner)
  return self.item
}