0
如果我要添加擴展到每一個對象,我可以做到以下幾點:雨燕「枚舉」基礎對象
extension AnyObject
{
func myFunc() { ... }
}
是否有類似的東西在那裏我可以添加一個功能,每一個枚舉?換句話說,每個枚舉的基類「class」是什麼?
如果我要添加擴展到每一個對象,我可以做到以下幾點:雨燕「枚舉」基礎對象
extension AnyObject
{
func myFunc() { ... }
}
是否有類似的東西在那裏我可以添加一個功能,每一個枚舉?換句話說,每個枚舉的基類「class」是什麼?
首先,請注意,您不能像上面那樣對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
並非所有'enum'都符合'RawRepresentable'。 –
@RomanSausarnes我不知道,會檢查,謝謝你的反饋! – dfri