Как создать массив классов и экземпляров объектов с его помощью в 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 внутри цикла и что-то с ним сделать. Я мог бы иметь дубликаты внутри массива, как показано. Что я должен поставить вместо ???, чтобы иметь возможность создавать соответствующие объекты?

7 голосов | спросил Ana 1 TueEurope/Moscow2015-12-01T20:35:28+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 20:35:28 +0300 2015, 20:35:28

3 ответа


0

Все, что вам нужно, это required init, способ создания экземпляра, который будет использоваться всеми Types, для которого вы хотите, чтобы это работало. protocol, содержащий метод 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")
    }
}
ответил R Menke 1 TueEurope/Moscow2015-12-01T21:33:15+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 21:33:15 +0300 2015, 21:33:15
0

Хорошо, вам понравится эта ссылка: http://ijoshsmith.com/2014/06/05 /инстанцировании-классы по имени-в-скор /

Он проведет вас через библиотеку Swift Obj ectFactory

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

Вы действительно не можете сделать это в Swift. Однако вы можете сделать это в Objective-C, чтобы вы могли просто написать оболочку, предоставляющую интерфейс Swift, где за кулисами фактическое создание объектов выполняется в Objective-C. Эта библиотека - именно то, что вы ищете.

Вам нужно создать ObjectFactory следующим образом:

let factory = ObjectFactory<MyClass>

Затем вы можете создать экземпляр MyClass , например:

let myClass1 = factory.createInstance(className: "MyClassName")
ответил Peyman 1 TueEurope/Moscow2015-12-01T20:48:27+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 20:48:27 +0300 2015, 20:48:27
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
*/

это очень близко к решению Р. Менке ...

ответил user3441734 1 TueEurope/Moscow2015-12-01T22:01:41+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 22:01:41 +0300 2015, 22:01:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132