Получить тип объекта из пустого массива 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