【发布时间】:2019-11-15 12:44:10
【问题描述】:
我有一个带有关联类型的枚举。所有关联的类型都符合协议。我想在不切换枚举的情况下从该协议访问一个变量。我怎样才能做到这一点?
我想从枚举元素中获取position对象而不用切换。
protocol ComponentModelProtocol {
var position: Int { get } //Describes in which stackview component will be. (0 means left, 1 means right)
var isTappable: Bool { get } //Adds gesture recognizer to the view If this is true
}
enum ComponentType {
case onelinetwolabel(content: LabelComponentModel)
case twolinelabel(content: BoxComponentModel)
case labelwithimage(content: BoxComponentModel)
case currencySelector(content: CurrencySelectorModel)
case seperator(position: Int)
}
struct CurrencySelectorModel: ComponentModelProtocol {
let position: Int
let isTappable: Bool
let currencyArray: [String]
}
struct LabelComponentModel: ComponentModelProtocol {
let key: String
let value: String
let position: Int
let isTappable: Bool
let labelType: OneLineTwoLabel.LabelType
init(key: String, value: String, position: Int, isTappable: Bool, labelType: OneLineTwoLabel.LabelType) {
self.key = key
self.value = value
self.position = position
self.isTappable = isTappable
self.labelType = labelType
}
init(key: String, value: String, position: Int) {
self.init(key: key,value: value,position: position, isTappable: false, labelType: .defaultLabel)
}
init(key: String, value: String, position: Int,isTappable: Bool) {
self.init(key: key,value: value,position: position, isTappable: isTappable, labelType: .defaultLabel)
}
}
//Struct for two line label component
struct BoxComponentModel: ComponentModelProtocol {
let key: String
let value: String
let position: Int
let isTappable: Bool
init(key: String, value: String, position: Int,isTappable: Bool) {
self.key = key
self.value = value
self.position = position
self.isTappable = isTappable
}
init(key: String, value: String, position: Int) {
self.init(key: key,value: value, position: position,isTappable: false)
}
}
我知道我可以通过在枚举中添加变量来做到这一点,如下所示,但它为每个元素添加了开关。如果有的话,我正在寻找更聪明的方法。
enum ComponentType: ComponentModelProtocol {
var position: Int {
switch self {
case .onelinetwolabel(content: let model):
return model.position
case .twolinelabel(content: let model):
return model.position
case .labelwithimage(content: let model):
return model.position
case .currencySelector(content: let model):
return model.position
case .seperator(position: let position):
return position
}
}
【问题讨论】: