Swift“Enum”基础对象

时间:2016-01-20 21:31:57

标签: swift cocoa enums

如果我想为每个对象添加扩展名,我可以执行以下操作:

extension AnyObject
{
     func myFunc() { ... }
}

是否有类似的地方我可以为每个枚举添加一个功能?换句话说,每个枚举的基础“类”是什么?

1 个答案:

答案 0 :(得分:4)

首先,请注意您不能像上面那样对AnyObject进行扩展,因为AnyObject是受保护的协议(所有类都隐式符合)而不是类型。参见例如

现在,您可以扩展上面显示的任何特定类型,例如extension Int { ... }。但是enum不是一种类型;而是一个有序的原始可表示值的“容器”。因此,更有效的比较可能是“如果我想通过extension class ... 为每个类添加扩展名,这自然是比较棘手的。

现在,所有带有rawValue枚举和rawValue 初始化程序符合protocol RawRepresentable,所以你可以扩展这个原始值的特定类型的协议:

extension RawRepresentable where RawValue == Int {
    var sqrt: Double {
        return pow(Double(rawValue),(1/2))
    }
}

此扩展属性可供所有明确使用相同原始值类型的枚举使用,在本例中为Int

enum MyIntegerLiteralEnum : Int {
    case One = 1
    case Two
    case Three
    case Four
}

print(MyIntegerLiteralEnum.One.sqrt)
print(MyIntegerLiteralEnum.Two.sqrt)
print(MyIntegerLiteralEnum.Four.sqrt)

/* 1.0
   1.4142135623731
   2.0               */

作为免责声明,请注意,此扩展程序适用于所有符合RawRepresentable rawValue类型Int的类型,而不仅仅是枚举类型。 E.g:

struct Foo : RawRepresentable {

    typealias RawValue = Int
    var bar : Int

    var rawValue: RawValue {
        get {
            return bar
        }
    }

    init(rawValue bar: Int) {
        self.bar = bar
    }
}

var a = Foo(rawValue: 16)
print(a.sqrt) // 4.0