मेरे पास मेरे आवेदन में कोरएमएल मॉडल है।

रन टाइम पर, प्रेडिक्शन फीचर को iOS8-10 पर अक्षम किया जाना चाहिए और iOS11 पर सक्रिय होना चाहिए।

कोरएमएल का उपयोग करने वाले सभी वर्गों पर संकलन करने में सक्षम होने के लिए, मैंने जोड़ा है:

@ उपलब्ध (आईओएस 11.0, *)

लेकिन .mlmodel सभी एनोटेशन को छोड़कर प्रत्येक पुनर्निर्माण पर स्विफ्ट कोड उत्पन्न करता है। और इसलिए संकलन त्रुटियां बनाना जैसे:

'MLModel' केवल iOS 11.0 या नए संस्करण पर उपलब्ध है

क्या Xcode9 में केवल mlmodel iOS11 बनाने का कोई तरीका है?

संपादित करें: यह बग XCode 9 बीटा 4 में ठीक किया गया था। अब समाधान की आवश्यकता नहीं है।

3
Xvolks 20 जुलाई 2017, 16:11

2 जवाब

सबसे बढ़िया उत्तर

अपडेट करें। 07/25/17: Apple ने अभी-अभी नया API डिवाइस पर मॉडल संकलित करने के लिए। इसका मतलब है कि अब आप चरण 1-4 से बच सकते हैं।

  1. (वैकल्पिक) Xcode बीटा sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer पर स्विच करें।
  2. अपना मॉडल संकलित करें: xcrun coremlcompiler compile /path/to/MyModel.mlmodel /path/to/output/folder
  3. संकलित मॉडल फ़ोल्डर MyModel.mlmodelc को अपने ऐप बंडल में रखें।
  4. अपने प्रोजेक्ट में मैन्युअल रूप से ऑटो-जेनरेटेड स्विफ्ट मॉडल क्लास (MyModel.swift) जोड़ें और इसे @available(iOS 11.0, *) के साथ एनोटेट करें। मॉडल क्लास कैसे खोजें
  5. अपना मॉडल लोड और प्रारंभ करें:

    चलो पथ = Bundle.main.path(forResource: "MyModel", ofType: "mlmodelc")

    चलो url = URL (fileURLWithPath: पथ!)

    चलो मॉडल = कोशिश करो! MyModel (सामग्रीऑफ़: url)

चेतावनी: मैंने ऐसे ऐप को AppStore पर अपलोड करने का प्रयास नहीं किया है। मैंने इसे अपने परीक्षण उपकरण पर आज़माया है, और यह काम करता है, मुझे यकीन नहीं है कि यह ऐपस्टोर पर रिलीज़ होने के बाद भी काम करना जारी रखता है।

6
Alexander Sosnovshchenko 25 जुलाई 2017, 11:47

यह एक बग की तरह लगता है - जेनरेट किए गए स्विफ्ट कोड में आपकी तरह ही @available एनोटेशन शामिल होना चाहिए, ताकि आपका ऐप संकलित हो, आईओएस 11 में चलते समय इसमें कॉल कर सके, और पुराने आईओएस में चलते समय इसे कॉल न करने की आवश्यकता हो संस्करण।

मैं उस बग को Apple में दर्ज करने की पुरजोर अनुशंसा करता हूं ताकि वे उम्मीद है कि Xcode 9 GM से पहले इसे ठीक कर सकें।

इस बीच, आप अपने मॉडल के लिए कोड जनरेशन अक्षम कर सकते हैं। अपने कोड प्रोजेक्ट सेटिंग्स में, अपने लक्ष्य के लिए बिल्ड सेटिंग्स के तहत, "कोरएमएल कोड जनरेशन लैंग्वेज" देखें और इसे "कोई नहीं" में बदलें।

बेशक, यह आपको अपनी परियोजना में उत्पन्न स्विफ्ट वर्ग का उपयोग करने से रोकेगा, हालाँकि। यह आपको दो विकल्पों के साथ छोड़ देता है:

  1. अपने मॉडल का मूल्यांकन करने के लिए सीधे कोर एमएल एपीआई का प्रयोग करें। (अर्थात, MyModelClass(), आदि के बजाय MLModel(contentsOf: url)।) सुविधाजनक रूप से, उत्पन्न स्विफ्ट वर्ग जिसे आपने देखा है लेकिन उपयोग नहीं कर रहे हैं, आपको उन सभी एपीआई कॉलों को दिखाता है जिनकी आपको आवश्यकता होगी।

  2. एक बार स्विफ्ट वर्ग उत्पन्न करें (केवल iOS 11 के लिए संकलन), फिर कोड को वहां से कॉपी करें और इसे एक नियमित स्रोत फ़ाइल में पेस्ट करें। चिपकाने के बाद, आप आवश्यक @available घोषणाएं जोड़ सकते हैं ताकि आप अपने न्यूनतम परिनियोजन लक्ष्य को iOS 10 या इससे पहले के संस्करण में बदल सकें।

दोनों ही मामलों में, यदि आप कभी भी मॉडल बदलते हैं तो आपको कुछ काम फिर से करने पड़ सकते हैं।

2
rickster 21 जुलाई 2017, 20:01