स्विफ्ट के साथ उपवर्ग UIApplication


91

ऑब्जेक्टिव सी में यह सरल था: यह मुख्य m.m फ़ाइल को अपडेट करने और UIApplicationMain को बदलने के लिए पर्याप्त था (पैरामीटर)

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));

लेकिन स्विफ्ट में कोई main.m फाइल नहीं है, क्योंकि गाइड कहता है

"वैश्विक दायरे में लिखे गए कोड का उपयोग कार्यक्रम के लिए प्रवेश बिंदु के रूप में किया जाता है, इसलिए आपको एक मुख्य कार्य की आवश्यकता नहीं है।"

तो, स्विफ्ट में UIApplication को कैसे उपवर्गित करें ?? कोई उपाय?


1
एप्लिकेशन-info.plist में UIApplicationMain()वर्ग का नाम जोड़ने के लिए पैरामीटर बदलना बेहतर क्यों होगा NSPrincipalClass?
एंड्रियास

जवाबों:


172

ध्यान दें कि सिंटैक्स को XCode 10.1 और स्विफ्ट 5 के लिए जून 2019 में अपडेट किया गया है ( यहां मैट के जवाब का श्रेय और && तुंग फैमिली का जवाब ), यदि आप पिछले सिंटैक्स की तलाश कर रहे हैं तो एडिट सेक्शन को देखें।

ठीक है, मैंने इसका हल ढूंढ लिया है

सबसे पहले, मैंने देखा है कि, AppDelegate.swift फ़ाइल के शीर्ष पर, यह रेखा है

@UIApplicationMain

चूंकि यह रेखा किसी भी दायरे से बाहर है (यह फ़ाइल स्तर पर है), इसे तुरंत निष्पादित किया जाता है, और मुझे लगता है कि संकलक इसे मानक मानक फ़ंक्शन में अनुवाद करता है।

इसलिए, मैंने यह किया, एक नई स्विफ्ट-ओनली एप्लिकेशन से शुरुआत की:

  • टिप्पणी की गई @UIApplicationMain
  • इस तरह एक main.swift फ़ाइल को जोड़ा (FLAPlication मेरी उपवर्ग है)। फ़ाइल को
    महत्वपूर्ण रूप से नामांकित होना आवश्यक है । मुख्य, अन्य फ़ाइलों पर शीर्ष स्तर के बयान समर्थित नहीं हैं! आप किसी अन्य फ़ाइल के अंदर UIApplicationMain () कॉल नहीं जोड़ सकते, अन्यथा आपको यह त्रुटि प्राप्त होगी:

शीर्ष स्तर पर अभिव्यक्तियों की अनुमति नहीं है

यह main.swift फाइल है

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)

फिर, इस कोड के साथ UIApplication subclass, FLApplication.swift के लिए एक स्विफ्ट फ़ाइल बनाएं:

import UIKit
import Foundation

class FLApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        print("send event")
    }
}

अब, UIApplication सही ढंग से उप-वर्गित है और आप लॉग में "ईवेंट भेजें" संदेश देखेंगे



संदर्भ के लिए OLD EDITS , चूंकि यह संस्करण 1 से संस्करण 3 में बहुत बदल गया है, मैं यहां पिछले सभी संपादन छोड़ता हूं


EDIT - मार्च 2015

हू UIApplicationMainजुनफेंग द्वारा टिप्पणी के रूप में अब के बारे में स्पष्टीकरण और main.swift फ़ाइल स्विफ्ट भाषा संदर्भ के गुण अनुभाग में प्रलेखित हैं: लिंक

जैसा कि थॉमस वर्बेक ने XCode 6.3 बीटा में टिप्पणी की है, आप पा सकते हैं कि C_ARGC और C_ARGV का नाम बदलकर क्रमशः Process.argc और Process.unsafeArgv कर दिया गया है। आपके UIApplicationMain कॉल को main.swift फाइल में अपडेट करना होगा:

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

प्री-एक्सकोड 8 सिंटेक्स था

import Foundation
import UIKit

UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))

EDIT - DEC 2016

बीटा 6 से पहले Xcode 8 के लिए समाधान

import Foundation
import UIKit

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

मैं समझने की कोशिश कर रहा हूं कि क्या सीधे AppDelegate.swift फ़ाइल में UIApplicationMain () कॉल करना संभव है, क्योंकि ऐसा लगता है कि इस पद्धति का "स्विफ्ट संस्करण" है, लेकिन मेरे पास एक संकलक त्रुटि है, मैं कुछ परीक्षण करूंगा। "केवल तेजी से" समाधान के लिए खोज
लोनबैन

अविश्वसनीय रूप से शांत। मैं उत्सुक हूं कि sendEvent:आजकल के ओवरराइडिंग के लिए उपयोग-केस क्या है (मुझे याद है कि यह आईओएस 3 में करना है ...)
मैट

2
यदि कोई जानना चाहता है, UIApplicationMainऔर main.swiftस्विफ्ट भाषा संदर्भ के गुण अनुभाग में प्रलेखित है। डेवलपर
.apple.com

संकेत के लिए धन्यवाद, मुझे 99% यकीन है कि स्विफ्ट मैनुअल की पहली रिलीज में इसे प्रलेखित नहीं किया गया था :-) हालांकि मैं इसका जवाब जोड़कर अद्यतन करूंगा।
लोम्बैक

5
बहुत बढ़िया जवाब। XCode 6.3 बीटा में, आप उस मिल सकती है C_ARGCऔर C_ARGVनाम दिया गया है Process.argcऔर Process.unsafeArgvक्रमशः। आपके UIApplicationMain कॉल को main.swift फ़ाइल में अद्यतन करने की आवश्यकता होगीUIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
थॉमस

4

एक विकल्प UIApplicationयह उपवर्ग के बजाय विस्तार करना है। Apple द्वारा जारी किए गए iBook के अनुसार , स्विफ्ट में एक्सटेंशन कर सकते हैं:

संगणित गुण और संगणित स्थिर गुण जोड़ें उदाहरण विधियों और प्रकार विधियों को परिभाषित करें नए आरंभीकरण प्रदान करें सदस्यताएँ परिभाषित करें और नए नेस्टेड प्रकारों का उपयोग करें प्रोटोकॉल के अनुरूप मौजूदा प्रकार बनाएं

अंश से: Apple Inc. "स्विफ्ट प्रोग्रामिंग लैंग्वेज।

यदि उप-वर्ग में आपकी ज़रूरतें UIApplicationउन क्षमताओं से संतुष्ट हैं, तो एक एक्सटेंशन जाने का रास्ता हो सकता है।


5
अच्छी सलाह - जवाब नहीं imho :)
Daij-Djan

1
  1. का एक उपवर्ग बनाएं UIApplicationऔर अपना तर्क जोड़ें

    import UIKit
    
    class CustomUIApplication: UIApplication {
        override func sendEvent(_ event: UIEvent) {
            super.sendEvent(event)
        }
    }
  2. एक main.swiftफ़ाइल बनाएं जो UIApplicationMain()वैश्विक फ़ंक्शन को कॉल करता है [लगभग] , जो आपके एप्लिकेशन का नया प्रवेश बिंदु है जिसे ओएस द्वारा कहा जाता है। यह फ़ंक्शन कहा जाता है फ़ंक्शन, UIApplicationवर्ग नाम, UIApplicationDelegateवर्ग नाम से तर्क प्राप्त करता है और मुख्य रन लूप शुरू करता है।

    import UIKit
    
    UIApplicationMain(
        CommandLine.argc,
        CommandLine.unsafeArgv,
    
        NSStringFromClass(CustomUIApplication.self), //was created at step 1
        NSStringFromClass(AppDelegate.self)
    )
  3. @UIApplicationMainडिफ़ॉल्ट पर टिप्पणी को हटाएं / टिप्पणी करें AppDelegate

    @UIApplicationMainउत्पन्न करता है main.swift

    यदि आप नहीं करते हैं तो आपको एक संकलन त्रुटि मिलेगी:

    UIApplicationMain विशेषता का उपयोग किसी ऐसे मॉड्यूल में नहीं किया जा सकता है जिसमें शीर्ष-स्तरीय कोड हो

    //@UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        //...
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.