如果要向每个对象添加扩展名,则可以执行以下操作:
extension AnyObject
{
func myFunc() { ... }
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的地方可以在每个枚举中添加函数?换句话说,每个枚举的基本“类”是什么?
首先,请注意,您不能AnyObject像AnyObject对受保护的协议(所有类都隐含地遵循)而不是类型那样对上述内容进行扩展。见例如
现在,您可以扩展上面显示的任何特定类型,例如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)