【问题标题】:Get associated type object from enum without switch从枚举中获取关联类型对象,无需切换
【发布时间】: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
        }
    }

【问题讨论】:

    标签: ios swift enums


    【解决方案1】:

    访问关联值的另一种方法是使用相当可怕的 (IMO ?)if case let 语法。

    我不确定它是否会让事情变得更容易,所以我不会在这里深入探讨,但你需要的所有信息都在 If Case Let syntax

    【讨论】:

    • 这真是一个不错的话题,但我认为它不能回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多