RayJiang9
206 天前
写得很好,枚举的关联值很好用的,在实际项目中也是在大量使用。
举个栗子,处理 IM 的自定义消息可以这样写:
由于枚举的特性,所有写 switch 的地方(如果没有 default ),会编译报错,这样在新增自定义消息类型的时候不会漏掉所有要改的地方。
其次可以把需要用的字段从 JSON 里解析出来,放进枚举方便使用。
enum IMMessageType {
    /// 0 (普通文本)
    case text(content: String)
    /// 1 (详情)
    case detail(id: Int, name: String)
    
    init(from json: JSON) throws {
        guard let messageType = json["messageType"].int else {
            throw CommonAPIError.invalidResponsor
        }
        switch messageType {
        case 0:
            self = .text(content: json["content"].stringValue)
        case 1:
            self = .detail(id: json["detailID"].intValue, name: json["detailName"].stringValue)
        default:
            throw CommonAPIError.invalidResponsor
        }
    }
    
    var displayText: String {
        switch self {
        case .text(let content):
            return content
        case .detail(_, let name):
            return "详情-\(name)"
        }
    }
}