如何在Swift中创建一个类实例对象数组?

7
我曾尝试过在之前提出问题,但并没有清晰地表达我的问题,所以我将在这里再次尝试。我还注意到了一个非常相似的问题,但它请求的是完全不同的东西。
我有以下代码:
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个回答

6

你所需要的是一个required init,一些方法来创建一个实例,这个实例将在所有你想要使用它的Types之间共享。一个包含init方法的protocol就可以了。

显然,如果init不需要参数,那么这种方法最简单。

缺点是你需要对结果进行下转换(downcast)。

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/

它会带你了解Swift库ObjectFactory

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

在Swift中你真的做不到这一点。但是,在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 Menke的解决方案...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接