如何在Swift中用它创建类和实例对象的数组?

时间:2015-12-01 17:35:28

标签: swift generics

我以前试过ask this question但是没有明确表达我的问题,所以我会在这里再试一次。我也注意到very similar sounding question,但它要求的是完全不同的东西。

我有以下代码:

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类型的对象并对其做一些事情。我可能在数组中有重复项,如图所示。我应该用什么代替???来实例化正确的对象?

3 个答案:

答案 0 :(得分:6)

您需要的只是required init,某种方式可以创建一个实例,该实例将在您希望其工作的所有Types之间共享。保存init方法的protocol可以正常运行。

显然,当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")
    }
}

答案 1 :(得分:0)

好的,你会喜欢这个链接: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

它引导您完成Swift库 Obj ectFactory

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

你真的不能在Swift中这样做。但是,你可以在Objective-C中完成它,这样你就可以简单地编写一个暴露Swift接口的包装器,在幕后,实际的对象创建在Objective-C中完成。该库正是您正在寻找的。

您需要创建一个像这样的ObjectFactory:

public boolean validateEmail(String email) {
    Pattern pattern = Pattern.compile(EMAIL_PATTERN);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

然后您可以实例化 MyClass 的实例,如:

let factory = ObjectFactory<MyClass>

答案 2 :(得分: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 Menke解决方案非常接近......