2015-02-21 9 views
10

खाली सरणी से ऐरे तत्व का उदाहरण प्राप्त करने का कोई तरीका है? (मैं क्योंकि मैं NSObject पर कुछ KVC तरीकों का उपयोग dynamic गुण की जरूरत है)खाली स्विफ्ट ऐरे से ऑब्जेक्ट प्रकार प्राप्त करें

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

क्या मैं जरूरत है इस तरह इस खाली सरणी से खाली कार वस्तु का उदाहरण पाने के लिए एक vay, उदाहरण के लिए है:

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

मुझे पता है कि मैं का उपयोग कर सकते हैं:

var object = Array<Car>.Element() 

लेकिन जब से मैं समारोह पैरामीटर से सरणी मिल यह मेरे लिए काम नहीं करता है और मैं इसे तत्व वर्ग है पता नहीं है।

मैं अपने खुद के प्रकार है कि यह कर देगा लिखने की कोशिश की है, और यह काम करता है, लेकिन फिर मैं dynamic के रूप में चिह्नित नहीं कर सकता, क्योंकि यह उद्देश्य सी में नहीं दर्शाया जा सकता मैं सरणी के विस्तार के बारे में करने की कोशिश की

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

लेकिन जब मैं इसका उपयोग करता हूं, तो यह कभी-कभी त्रुटि fatal error: NSArray element failed to match the Swift Array Element type

+0

मुझे नहीं लगता कि आप यह कर सकते हैं। जाहिर है अगर सरणी में कोई तत्व है तो आप सरणी या तत्व को पार कर सकते हैं और हम इसके गतिशील प्रकार को सीख सकते हैं। लेकिन यदि आप किसी फ़ंक्शन में खाली सरणी पास करते हैं, तो वह फ़ंक्शन यह नहीं सीख सकता कि किस प्रकार की चीज सरणी _would_ किसी सरणी के _had_ की सरणी हो। – matt

+0

मुझे लगता है कि मैं आपको _why_ के बारे में सोचने के लिए कहूंगा कि आपको विश्वास है कि आपको आत्मनिरीक्षण की इस डिग्री की आवश्यकता है। आप क्या कर रहे हैं _really_ करने की कोशिश कर रहे हैं? – matt

उत्तर

0

कुछ ऐसा करता है?

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

यह स्विफ्ट 2.0 के रूप में काम करने लगता है:

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

सुनिश्चित नहीं हैं कि अगर यह पहले के संस्करणों में काम करेंगे।

5

स्विफ्ट 3: एक खाली सरणी के तत्व प्रकार प्राप्त करें:

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

स्विफ्ट 3,1

let cars = [Car]() 
let car = type(of: cars).Element() 
let carType = type(of: cars).Element.self 
संबंधित मुद्दे