2016-09-30 11 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を継承するAppleフレームワークの多くのクラスは、サブクラス化されているはずです。それは環境に依存します。 – 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 = Battery.type'''は、各クラスに対して明示的にコードを保存しなければならないので、コードを保存する目的を打ち消します。 – jgraft

+0

Vadianの答えを参照してください:) – Lance

関連する問題