2015-12-01 63 views
3

我之前嘗試過ask this question,但沒有清楚地表達我的問題,所以我會再試一次。我還注意到一個very similar sounding question,但它要求完全不同的東西。如何在Swift中用它創建一個類和實例對象的數組?

我有以下代碼:

class Base { 
    func launch(code1: Int, code2: Int) { ... } 
} 

class A: Base {} 
class B: Base {} 
class C: Base {} 

let classes = [A.self, B.self, A.self, B.self, C.self] 
for cls in classes { 
    let obj = ??? 
} 

我想實例化循環內cls類型的對象,並用它做什麼。如圖所示,我可能在數組內有重複項。我爲了能夠實例化正確的對象而將???放入什麼位置?

回答

4

所有你需要的是一個required init,某種方式創建一個實例,該實例將在您希望爲之工作的所有Types之間共享。包含init方法的將會很好。

很明顯,當init不需要參數時,這個工作最簡單。

缺點是您確實需要向下轉換結果實例。

protocol ZeroParamaterInit { 
    init() 
} 

class Base : ZeroParamaterInit { 
    func launch(code1: Int, code2: Int) { } 
    required init() { 

    } 
} 

class A: Base {} 
class B: Base {} 
class C: Base {} 

let classes : [ZeroParamaterInit.Type] = [A.self,B.self] 
var instances : [Any] = [] 

for cls in classes { 

    let instance = cls.init() 
    instances.append(instance) 

} 

for instance in instances { 

    if let test = instance as? A { 
     print("A") 
    } 
    if let test = instance as? B { 
     print("B") 
    } 
    if let test = instance as? C { 
     print("C") 
    } 
} 
0

好吧,你一定會喜歡這個鏈接: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

它會引導你雨燕庫的OBJ ectFactory

https://github.com/ijoshsmith/swift-factory

你真的不能在斯威夫特這樣做。但是,您可以在Objective-C中執行此操作,以便您可以簡單地編寫一個封裝器,在後臺暴露一個Swift接口,並在Objective-C中完成實際的對象創建。這個庫正是你想要的。

你需要創建這樣一個的ObjectFactory:

let factory = ObjectFactory<MyClass> 

然後你就可以實例化MyClass的一個實例像:

let myClass1 = factory.createInstance(className: "MyClassName") 
0
import Foundation 

class Base {} 

class A: Base { var i: Int = 1 } 
class B: Base { var i: String = "bravo" } 
class C: Base { var i: Bool = true } 

let classes = [A.self, B.self, A.self, B.self, C.self] 

for cls in classes { 
    var obj: Base? { 
     switch cls { 
     case is A.Type: 
      return A() 
     case is B.Type: 
      return B() 
     case is C.Type: 
      return C() 
     default: 
      return nil 
     } 
    } 
    dump(obj) 
} 


/* 
▿ A 
    ▿ Some: A #0 
    - super: Base 
    - i: 1 
▿ B 
    ▿ Some: B #0 
    - super: Base 
    - i: bravo 
▿ A 
    ▿ Some: A #0 
    - super: Base 
    - i: 1 
▿ B 
    ▿ Some: B #0 
    - super: Base 
    - i: bravo 
▿ C 
    ▿ Some: C#0 
    - super: Base 
    - i: true 
*/ 

這是非常接近於R門客解決方案...

相關問題