Swift“枚举”基础对象

Mat*_*ijn 0 cocoa enums swift

如果要向每个对象添加扩展名,则可以执行以下操作:

extension AnyObject
{
     func myFunc() { ... }
}
Run Code Online (Sandbox Code Playgroud)

是否有类似的地方可以在每个枚举中添加函数?换句话说,每个枚举的基本“类”是什么?

dfr*_*fri 5

首先,请注意,您不能AnyObjectAnyObject对受保护的协议(所有类都隐含地遵循)而不是类型那样对上述内容进行扩展。见例如

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

现在,所有带有rawValue和的初始rawValue枚举符by均符合protocolRawRepresentable,因此您可以将此协议扩展为特定类型的原始值:

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

这个扩展属性将对所有显式使用相同原始值类型的枚举可用,在这种情况下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               */
Run Code Online (Sandbox Code Playgroud)

作为免责声明,请注意,此扩展将可用于所有RawRepresentable与a rawValue类型一致的类型Int,而不仅限于枚举类型。例如:

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
Run Code Online (Sandbox Code Playgroud)

  • 并非所有的“枚举”都符合“ RawRepresentable”。 (2认同)