一尘不染

使用协议将案例添加到现有枚举

swift

我想创建一个protocol在所有enums符合此条件的情况下强制执行某种情况的方法protocol

例如,如果我有一个enum这样的:

enum Foo{
    case bar(baz: String)
    case baz(bar: String)
}

我想用扩展它protocol,增加另一种情况:

case Fuzz(Int)

这可能吗?


阅读 194

收藏
2020-07-07

共1个答案

一尘不染

设计

解决方法是使用struct带有static变量的a。

注意:这是在 Swift 3 中完成的Notification.Name

以下是 Swift 3* 的实现 *

结构:

struct Car : RawRepresentable, Equatable, Hashable, Comparable {

    typealias RawValue = String

    var rawValue: String

    static let Red  = Car(rawValue: "Red")
    static let Blue = Car(rawValue: "Blue")

    //MARK: Hashable

    var hashValue: Int {
        return rawValue.hashValue
    }

    //MARK: Comparable

    public static func <(lhs: Car, rhs: Car) -> Bool {

        return lhs.rawValue < rhs.rawValue
    }

}

协议

protocol CoolCar {

}

extension CoolCar {

    static var Yellow : Car {

        return Car(rawValue: "Yellow")
    }
}

extension Car : CoolCar {

}

调用中

let c1 = Car.Red


switch c1 {
case Car.Red:
    print("Car is red")
case Car.Blue:
    print("Car is blue")
case Car.Yellow:
    print("Car is yellow")
default:
    print("Car is some other color")
}

if c1 == Car.Red {
    print("Equal")
}

if Car.Red > Car.Blue {
    print("Red is greater than Blue")
}

注意:

请注意,该方法不能替代enum,仅在编译时不知道值时才使用此方法。

2020-07-07