2015-02-21 24 views
10

nesne tipini alın?boş diziden Dizi elemanının örneğini almak için bir yolu var mı boş Swift Array

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

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>() 

Ne gerek böyle mesela bu boş diziden boş Araba nesnenin örneğini almak için bir vay, (Ben NSObject bazı KVC yöntemleri kullanın çünkü dynamic özelliklerini gerekir)

Ben kullanabileceğinizi biliyor:

var object = Array<Car>.Element() 

ama işlevi parametresinden dizisini almak beri bu benim için çalışmıyor ve bunu eleman sınıf olduğunu bilmiyorum.

Bunu yapacak kendi türünü yazmaya çalıştık ve bu çalışır, ancak Amaç C. temsil edilemiyor çünkü Array uzatılmasını yazmaya çalıştı sonra dynamic olarak işaretlemek edemez

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

fakat kullandığımda, bazen hata veriyor fatal error: NSArray element failed to match the Swift Array Element type

+0

ben bunu yapabilirsiniz sanmıyorum. Dizi herhangi öğeler içeriyor Açıkçası eğer dizi veya bir öğe geçebilir ve biz onun dinamik türünü öğrenebilirsiniz. Eğer bir işleve boş dizi geçirirseniz Ama, bu fonksiyon hiç öğesi _had_ eğer bir dizi olması _would_ şey dizinin ne tür öğrenemez. – matt

+0

Ben size içgözlem bu derecede ihtiyaç inanıyoruz _why_ düşünmenizi rica ediyorum sanırım. Ne _really_ yapmaya çalışıyorsun? – matt

cevap

0

Böyle bir şey mi var?

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

Bu Swift 2.0 olarak çalışmaya görünüyor: o önceki sürümlerinde çalışacak

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

emin olmaz. 3

5

Swift: Boş dizinin eleman tipini alın:

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

Swift 3,1

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