当前位置:  开发笔记 > IOS > 正文

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

如何解决《使用协议将案例添加到现有枚举》经验,为你挑选了3个好方法。

我想创建一个protocol强制执行某个案例的所有enums符合此要求的案例protocol.

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

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

我想扩展它protocol,增加另一个案例:

case Fuzz(Int)

这可能吗?



1> user1046037..:
设计

解决方法是使用structstatic变量的变量.

注意:这是在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,只有在编译时未知值时才使用此方法.



2> R Menke..:

不,因为你不能宣布一个case外面的enum.



3> 小智..:

一个extension可以添加嵌套enum,就像这样:

enum Plants {
  enum Fruit {
     case banana
  }
} 


extension Plants {
  enum Vegetables {
     case potato
  }
}

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有