简体   繁体   中英

Switch-Case Refactor in Swift With Clean Way

in this example DisplayDataItem protocol conforming by some classes (ie DisplaySingle ) it simple holds properties such as cellType, title and type. for shows a single banner, other types can be slider, carousel too.

I like to refactor createBanner() method to cleaner-way instead switch-case.

What is the protocol oriented way to do?

  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
}

I don't understand your code. But your intention was somewhat understood.

i will make getItem method into 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)
    }
  }
}

And i assumed that ViewModel have Banner? , DisplayDataItem? and Banner object have DisplayType

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

You could do something like this:

extension DisplayType {

    var displayDataItem: DisplayDataItem? {

        switch self {
        case .Banner:
            return DisplaySingle(banner: banner)
        case .Slider:
            return DisplaySlider(banner: banner)
        case default:
            return nil
        }
    }
}

and then change your createBanner function to this:

public func createBanner() -> DisplayDataItem? {

    guard let banner = banner else { return nil }

    let displayType = DisplayType(rawValue: banner.displayType ?? "Single")
    return displayType.displayDataItem
}

Your code wasn't compiling so you will need make some tweaks but you get the idea I think.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM