2014-07-08 11 views
5

में मुद्दों कास्टिंग मैं CoreData के साथ एक्सकोड 6 पर स्विफ्ट का उपयोग कर रहा हूं।स्विफ्ट और कोरडाटा परीक्षण बनाम गैर-परीक्षण

मैंने रिलीज नोट्स पढ़े हैं और मॉड्यूल नाम (ऐप नाम) के साथ कोर डेटा मॉडल को चिह्नित करना सुनिश्चित करने के बारे में यह issue देखा है ताकि आप अपने मॉडल प्रकार पर रन टाइम पर NSManagedObject डाल सकें।

जब मैं ऐसा करता हूं, तो मैं ठीक से चलाने के लिए एक ऐप प्राप्त कर सकता हूं (अच्छा!)। लेकिन, मेरा मुद्दा है, जब मैं परीक्षण करने की कोशिश है कि एक ही कोड, परीक्षण हमेशा दुर्घटना होगा जब भी डाली एक Swift dynamic cast failed त्रुटि (बुरा :() के साथ होता है। यह यह मुश्किल अपने आवेदन का परीक्षण करने में आता है।

है ? वहाँ मॉड्यूल का नाम हम किसी भी संकेत दिए गए के लिए पहले से ही ऐप्लिकेशन चल बनाम परीक्षण के लिए बनाया गया है का उपयोग

धन्यवाद पर कोई प्रभाव ...

अप का पालन करें:

यह आदर्श नहीं है: जैसा ऊपर बताया गया है, स्विफ्ट को कोर डी का उपयोग करने के लिए एटीए मॉडल, आपको कक्षा के नाम को अपने ऐप के नाम से सजाने की जरूरत है। यह ऐप बनाने के लिए मिलता है, लेकिन परीक्षण एक अलग ऐप नाम के तहत चलाए जाते हैं! इसका मतलब है कि आपको डेटा मॉडलर में जाना होगा और myAppname.myEntity से myAppnameTests.myEntity से उस वर्ग का नाम बदलना होगा, इससे पहले कि आप उन संस्थाओं का उपयोग किसी नाम से उपयोग या कॉल करते समय कर सकें।

@objc(YourEntity) 
class YourEntity: NSManagedObject { 
    ... 
} 

मैं एक बग के रूप में इस लगता है कि अगर अपनी परियोजना किसी भी objective- शामिल नहीं करता है:

+0

@objc (MyClassName) के साथ कक्षा का नाम सजाने का प्रयास करें। यह सामान्य नाम मैंगलिंग को बाईपास करेगा। फिर आपको डेटा मॉडल में मॉड्यूल नाम के बारे में चिंता करने की आवश्यकता नहीं है। –

+0

यदि मैं अपनी इकाई कक्षाओं को तेज़ी से लिखता हूं, तो उन्हें 'objc (xxx)' का उपयोग करके सजाने के लिए - मुझे गतिशील कास्ट त्रुटि मिलती है जब भी मैं उस नाम के साथ अन्य स्विफ्ट कोड में इकाई का उपयोग करने का प्रयास करता हूं ... निराशाजनक ... –

+0

आज़माएं यह: http://stackoverflow.com/a/26568813/438063 – Lucien

उत्तर

1

आप यह भी इस तरह की एक ऑब्जेक्टिव-सी वर्ग बनाने के लिए फाइल Entity.swift करने के लिए एक लाइन जोड़ने की जरूरत सी कोड हालांकि, आपको यह तय होने तक उस लाइन को जोड़ने की आवश्यकता है।

मैंने इसे यहां से सीखा।

Youtube video at 11:45

+0

मेरी प्रोजेक्ट का उद्देश्य सी कोड है - लेकिन मेरे पास जो समस्याएं हैं, वे हैं स्विफ्ट कोड कॉलिंग (या कॉल करने का प्रयास कर रहे हैं) स्विफ्ट कोर डेटा कोड ... :( –

+0

तो आप मेरी विधि का प्रयास कर सकते हैं। यह मेरे लिए काम करता है। मेरी विधि, आपको किसी ऐप नाम कर्मचारी को इकाई में जोड़ने की आवश्यकता नहीं है। बस इसे अपने वर्ग के नाम से अकेला छोड़ दें। –

4

आपका पूरी तरह से सही हो, मुद्दा है जब आप अनुप्रयोग चलाने यह myAppname.myEntity की तलाश में है और यह myAppnameTests.myEntity के रूप में देख रहा है जब आप टेस्ट के रूप में चलाते हैं। इस समय मैं जिस समाधान का उपयोग करता हूं (एक्सकोड 6.1) कोरडाटा यूआई में Class फ़ील्ड भरना नहीं है, और इसके बजाय कोड में ऐसा करना है।

यह कोड पता लगाएगा कि आप ऐप बनाम टेस्ट के रूप में चल रहे हैं और सही मॉड्यूल नाम का उपयोग कर रहे हैं और managedObjectClassName अपडेट करें।

lazy var managedObjectModel: NSManagedObjectModel = { 
    // The managed object model for the application. This property is not optional... 
    let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")! 
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)! 

    // Check if we are running as test or not 
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject] 
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest" 

    // Create the module name 
    let moduleName = (isTest) ? "StreakTests" : "Streak" 

    // Create a new managed object model with updated entity class names 
    var newEntities = [] as [NSEntityDescription] 
    for (_, entity) in enumerate(managedObjectModel.entities) { 
     let newEntity = entity.copy() as NSEntityDescription 
     newEntity.managedObjectClassName = "\(moduleName).\(entity.name)" 
     newEntities.append(newEntity) 
    } 
    let newManagedObjectModel = NSManagedObjectModel() 
    newManagedObjectModel.entities = newEntities 

    return newManagedObjectModel 
}() 
+1

यदि आप चाहते हैं कि आपका मॉड्यूलनाम गतिशील हो (इसे हार्डकोड करने की बजाय), 'NSBundle.mainBundle()। InfoDictionary? ["CFBundleName"] का उपयोग करें! इसे "स्ट्रीक" वापस करना चाहिए –

संबंधित मुद्दे