Получить тип объекта из пустого массива Swift

Есть ли способ получить экземпляр элемента Array из пустого массива? (Мне нужны свойства dynamic, потому что я использую некоторые методы KVC на NSObject)

import Foundation

class BaseClass: NSObject {
    func myFunction() {
        doWork()
    }
}

class Car: BaseClass {
    dynamic var id: Int = 0
}

class Bus: BaseClass {
    dynamic var seats: Int = 0
}

var cars = Array<Car>()

Мне нужно, чтобы получить экземпляр пустого объекта Car из этого пустого массива, например:

var carFromArray = cars.instanceObject() // will return empty Car object

Я знаю, что могу использовать:

var object = Array<Car>.Element()

но это не работает для меня, так как я получаю массив из параметра функции, и я не знаю этого класса элемента.

Я попытался написать свой собственный тип, который будет делать это, и он работает, но тогда я не могу пометить его как dynamic, поскольку он не может быть представлен в Objective C. Я попытался написать расширение Array

extension Array {
    func instanceObject<T: BaseClass>() -> T? {
        return T()
    }
}

но когда я его использую, он иногда вызывает ошибку fatal error: NSArray element failed to match the Swift Array Element type

Ответ 1

Swift 3: Получить пустой элемент элемента массива:

let cars = [Car]()                    // []
let arrayType = type(of: cars)        // Array<Car>.Type
let carType = arrayType.Element.self  // Car.Type
String(describing: carType)           // "Car"

Ответ 2

Это похоже на Swift 2.0:

let nsobjectype = cars.dynamicType.Element()
let newCar = nsobjectype.dynamicType.init()

Не уверен, что он будет работать в более ранних версиях.

Ответ 3

Что-то вроде этого?

let cars = Array<Car>()
let car = cars.dynamicType.Element()

Ответ 4

Swift 3.1

let cars = [Car]()
let car = type(of: cars).Element()
let carType = type(of: cars).Element.self