2016-08-22 16 views
14

हम एक कस्टम UIApplication वस्तु है, तो हमारे main.swiftXcode 8 बीटा 6: main.swift संकलन नहीं होगा

import Foundation 
import UIKit 

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate)) 

था और 8 बीटा 5 तो हम इस प्रयोग किया जाता है कि Xcode में काम नहीं किया

//TODO Swift 3 workaround? https://forums.developer.apple.com/thread/46405 
UIApplicationMain(Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self)) 

Xcode 8 बीटा 6 पर हम अनसुलझे पहचानकर्ता 'प्रक्रिया'

क्या हम Xcode 8 बीटा 6/स्विफ्ट 3 में क्या करना UIApplicationMain परिभाषित करने की जरूरत है की उपयोग मिल सकता है?

+0

मैं यूआईपीप्लिकेशन क्लास को इस तरह कैसे निर्दिष्ट करूं? –

उत्तर

31

मैं इसे इस तरह से लिखें:

UIApplicationMain(
    CommandLine.argc, 
    UnsafeMutableRawPointer(CommandLine.unsafeArgv) 
     .bindMemory(
      to: UnsafeMutablePointer<Int8>.self, 
      capacity: Int(CommandLine.argc)), 
    nil, 
    NSStringFromClass(AppDelegate.self) 
) 

UIApplication वर्ग बदलने के लिए, कि निर्माण में nil के लिए NSStringFromClass(MobileUIApplication.self) स्थानापन्न।

हालांकि, अगर आपकी केवल उद्देश्य यहां साझा आवेदन उदाहरण के रूप में एक UIApplication उपवर्ग विकल्प है, वहाँ एक आसान तरीका है: Info.plist में, "प्रिंसिपल वर्ग" कुंजी जोड़ सकते हैं और करने के लिए अपने मूल्य के लिए सेट अपने यूआईपीप्लिकेशन सबक्लास का स्ट्रिंग नाम, और @objc(...) विशेषता के साथ उस सबक्लास की अपनी घोषणा को चिह्नित करें, इसे वही उद्देश्य-सी नाम दें।

3

ऐसा लगता Process बीटा 6.

CommandLine

में CommandLine को नाम दिया गया है लेकिन CommandLine.unsafeArgv के प्रकार UIApplication का दूसरा तर्क mismatching है, ताकि आप कुछ इस तरह लिखने के लिए आवश्यकता हो सकती है:

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in 
    _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self)) 
} 

(अद्यतन) इस विसंगति को एक बग के रूप में माना जाना चाहिए। आम तौर पर, जब आप बीटा 5 में तीसरे पैरामीटर की तरह "यह-होना-नहीं होना" चीजें पाते हैं, तो आप बेहतर bug report भेज देंगे। मुझे उम्मीद है कि यह "बग" जल्द ही तय हो जाएगा।


यदि आप बस अपनी कस्टम यूआईएप्लिकेशंस क्लास को नामित करना चाहते हैं, तो आप Info.plist का उपयोग क्यों नहीं करते?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication 

अपने Info.plist में ("प्रिंसिपल वर्ग" गैर कच्चे कुंजी के रूप में दिखाया गया है/मान देख।)

इस के साथ

, आप @UIApplicationMain का उपयोग कर सामान्य तरीके के साथ अपने MobileUIApplication उपयोग कर सकते हैं। UIApplicationMain की

(इसके अलावा) हैडर डॉक:

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no 
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init. 
+0

कृपया ध्यान दें कि इस स्थिति को एक बग के रूप में माना जाता है। यह उत्तर यहां दिए गए किसी के समान है: https://bugs.swift.org/browse/SR-1390?focusedCommentId=17441&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment -17441 – matt

+0

@ मैट, मुझे नहीं लगता कि 'प्रक्रिया' का नाम बदलकर 'कमांडलाइन' को बग रिपोर्ट के समान नहीं है।लेकिन, हाँ, प्रतीत होता है कि मेरे उत्तर में मुख्य कोड बग के लिए एक कामकाज दिखा रहा है, और मैं भाग को अपडेट करूंगा। – OOPer

+0

आईएसओ का उपयोग करते समय एनएसपीआरएन प्रिंसिपल अप्रासंगिक है। लेकिन हम आईओएस का उपयोग करते हुए OP _is_ जानते हैं या हम UIAplicationMain के बारे में बात नहीं करेंगे। – matt

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