2016-09-30 78 views
0

saw this question,但我想要的是創建一個實際類的數組,以便我可以調用每個類的函數。Swift - 創建一個類的數組

實施例:

let syncClasses:[Any] = [Battery, Tank, Gas] 
for object in syncClasses { 
    object.someClassMethod() 
} 

我嘗試使用[Any]作爲一種類型的陣列,但拋出:

Expected member name or constructor call after type name 

所有類的來自相同Object類繼承,所以我可以通過破解它做:

let syncClasses:[Object] = [Battery(), Tank()] 

但後來我必須使我想要的功能調用一個方法而不是一個類函數,這不是我想要的那麼幹淨。

回答

4

一個SWIFTY的方法是使用一個協議:

protocol Drainable { 
    static func drain() 
} 

class Battery : Drainable { 
    static func drain() { print("battery drained") } 
} 

class Tank : Drainable { 
    static func drain() { print("tank drained") } 
} 

class Gas : Drainable { 
    static func drain() { print("gas drained") } 
} 

let syncClasses : [Drainable.Type] = [Battery.self, Tank.self, Gas.self] 

for object in syncClasses { 
    object.drain() 
} 
+0

非常好。謝謝。有什麼時候使用協議來分享繼承和使用超類的標準/規則? – jgraft

+0

不是。但不要打擊類型系統。蘋果框架中許多繼承自Objective-C的類應該被分類。這取決於環境。 – vadian

0

您可以使用.self來獲取類類型的離類符號是這樣的:

class Battery { 
    class func test() {} 
} 

class Tank {} 
class Gas {} 

let array: [AnyClass] = [Battery.self, Tank.self, Gas.self] 

for thing in array { 
    if let battery = thing as? Battery.Type { 
     Battery.test() 
    } 
} 
+0

謝謝您的回答。這對於創建數組非常有用。但是之後必須用'''讓電池=東西來解開每個班級? Battery.type'''的種類破壞了保存代碼的目的,因爲您必須爲每個類明確地執行此操作。 – jgraft

+0

查看Vadian的回答:) – Lance