首页 > 解决方案 > 更改关联枚举的值

问题描述

我有这个associated enum:

public typealias TextFieldInfo = (type: TextFieldType, title: String, entry: String)

public enum TextFieldType {
    case text
    case number
    case capitalLetter
    case date
    case entry
}

public enum TextFieldModelEnum {
    case generic(type: TextFieldType, title: String)
    case entry(type: TextFieldType, title: String, entry: String)

    var info: TextFieldInfo {
        switch self {
        case .generic(let type, let title):
            return (type, title, "")
        case .entry(let type, let title, let entry):
            return (type, title, entry)
        }
    }
}

我正在尝试更改entry以下方法中的值,但它在第一行给我一个错误:

无法分配给“字符串”类型的不可变表达式

extension ThirdViewController: TextProtocol {
    func getText(text: String) {
        self.array[self.rowListSelected].info.entry = text
        let indexPaths = [IndexPath(row: self.rowListSelected, section: 0)]
        self.tableView.reloadRows(at: indexPaths, with: .none)
        print(text)
    }
}

标签: swiftstructenums

解决方案


我想我终于想出了如何使用set计算属性来做到这一点

var info: TextFieldInfo { 
    get {
        switch self {
        case .generic(let type, let title):
            return (type, title, "")
        case .entry(let type, let title, let entry):
            return (type, title, entry)
        }
    }
    set {
        switch self {
        case .generic:
            self = TextFieldModelEnum.generic(type: newValue.type, title: newValue.title)
        case .entry:
           self = TextFieldModelEnum.entry(type: newValue.type, title: newValue.title, entry: newValue.entry)
        }
    }
}

例子

var tf = TextFieldModelEnum.entry(type: .text, title: "A Title", entry: "An Entry")
print(tf.info.entry)
print(tf.info.title)
tf.info.entry = "new entry"
print(tf.info.entry)
tf.info.title = "new title"
print(tf.info.title)

输出

一个条目
一个标题
新条目
新标题


推荐阅读