2016-01-20 65 views
0

如果我要添加擴展到每一個對象,我可以做到以下幾點:雨燕「枚舉」基礎對象

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

是否有類似的東西在那裏我可以添加一個功能,每一個枚舉?換句話說,每個枚舉的基類「class」是什麼?

回答

3

首先,請注意,您不能像上面那樣對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,而不僅僅是枚舉類型。例如:

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 
+2

並非所有'enum'都符合'RawRepresentable'。 –

+1

@RomanSausarnes我不知道,會檢查,謝謝你的反饋! – dfri