如果我想为每个对象添加扩展名,我可以执行以下操作:
extension AnyObject
{
func myFunc() { ... }
}
是否有类似的地方我可以为每个枚举添加一个功能?换句话说,每个枚举的基础“类”是什么?
答案 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