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.