সুইফট সহ সাবক্লাস ইউআইএ অ্যাপ্লিকেশন


92

উদ্দেশ্য সিতে এটি সহজ ছিল: এটি মূল.এম ফাইল আপডেট করতে এবং ইউআইএপ্লিকেশন মেইন () পরামিতিগুলি পরিবর্তন করতে যথেষ্ট ছিল

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

তবে দ্রুতগতিতে কোনও মেইন.এম ফাইল নেই, যেহেতু গাইড বলেছে

"গ্লোবাল স্কোপে লিখিত কোডটি প্রোগ্রামের প্রবেশ প্রবেশদ্বার হিসাবে ব্যবহৃত হয়, সুতরাং আপনার কোনও মূল ফাংশনের প্রয়োজন নেই।"

সুতরাং, কীভাবে ইউআইএ অ্যাপ্লিকেশনটি দ্রুতগতিতে সাবক্লাস করবেন? যেকোনো পরামর্শ?


4
অ্যাপ-ইনফরমেশন.পুলিস্ট্রে UIApplicationMain()শ্রেণীর নাম যুক্ত করার জন্য কেন প্যারামিটারগুলি পরিবর্তন করা NSPrincipalClassপছন্দনীয় হবে?
আন্দ্রেয়াস

উত্তর:


173

উল্লেখ্য সিনট্যাক্স জুন 2019 সালে উপর XCode 10.1 এবং সুইফট 5 আপডেট করা হয়েছে (ক্রেডিট অনুজ্জ্বল এর উত্তর এখানে && কাঠ বার্নিশ করার কাজের Fam এর উত্তর এখানে ), আপনি যদি এই পূর্ববর্তী syntaxes জন্য সম্পাদন করা অধ্যায় দিকে তাকাও।

ঠিক আছে, আমি সমাধানটি খুঁজে পেয়েছি

প্রথমে, আমি লক্ষ্য করেছি যে, অ্যাপডেলিগেট.সুইফ্ট ফাইলের শীর্ষে, এই লাইনটি রয়েছে

@UIApplicationMain

যেহেতু এই লাইনটি কোনও স্কোপের বাইরে (এটি ফাইল স্তরের), এটি অবিলম্বে কার্যকর করা হয়েছে, এবং আমি ধরে নিই যে সংকলকটি এটি একটি স্ট্যান্ডার্ড মূল ফাংশনে অনুবাদ করে।

সুতরাং, আমি এটি করেছি, একটি নতুন সুইফট-কেবল অ্যাপ্লিকেশন থেকে শুরু করে:

  • মন্তব্য সমূহ @UIApplicationMain
  • এর মতো একটি মেইন.সুইফ্ট ফাইল যুক্ত হয়েছে (FLApplication আমার সাবক্লাস)।
    গুরুত্বপূর্ণ ফাইল নামের হতে হবে main.swift, যেহেতু শীর্ষ স্তরের বিবৃতি অন্যান্য ফাইল সমর্থিত নয়! আপনি অন্য কোনও ফাইলের মধ্যে ইউআইএপ্লিকেশন মেইন () কলটি যুক্ত করতে পারবেন না, অন্যথায় আপনি এই ত্রুটিটি পাবেন:

শীর্ষ স্তরে প্রকাশের অনুমতি নেই

এটি মেইন.সুইফ্ট ফাইল

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

তারপরে, এই কোড সহ ইউআইএপ্লিকেশন সাবক্লাস, FLApplication.swift এর জন্য একটি সুইফ্ট ফাইল তৈরি করুন:

import UIKit
import Foundation

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

এখন, ইউআইএপ্লিকেশনটি সঠিকভাবে উপশ্রেণিত এবং আপনি লগটিতে "ইভেন্ট প্রেরণ করুন" বার্তা দেখতে পাবেন


পুরানো সম্পাদনাগুলি
রেফারেন্সের জন্য, যেহেতু এটি সংস্করণ 1 থেকে সংস্করণ 3 তে অনেক পরিবর্তন হয়েছে, তাই আমি পূর্ববর্তী সমস্ত সম্পাদনাগুলি এখানে রেখেছি


সম্পাদনা - মার্চ 2015

হু জুনফেঙের মন্তব্য অনুসারে এখন UIApplicationMainসুইট ল্যাঙ্গুয়েজ রেফারেন্সের বৈশিষ্ট্য বিভাগে মূল কথা এবং মেইন.সুইফ্ট ফাইলটি নথিভুক্ত করা হয়েছে: লিঙ্ক

এক্সকোড be.৩ বিটাতে টমাস ভার্বেকের মন্তব্য অনুসারে, আপনি দেখতে পাবেন যে সি_আরজিসি এবং সি_আরজিভি যথাক্রমে প্রসেস.আরজিসি এবং প্রসেস.আনস্যাফএআরজিভিতে নামকরণ করা হয়েছে। আপনার ইউআইএআইপ্লিকেশনমিন কলকে মূল.ইউইফ্ট ফাইলটিতে আপডেট করতে হবে:

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

প্রাক-এক্সকোড 8 সিনট্যাক্সটি ছিল

import Foundation
import UIKit

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

সম্পাদনা - ডিসি 2016

বিটা 6 এর আগে এক্সকোড 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 ফাইলটিতে ইউআইএপ্লিকেশন মেইন () কল করা সম্ভব কিনা তা বোঝার চেষ্টা করছি, যেহেতু মনে হয় এই পদ্ধতির একটি "সুইফ্ট সংস্করণ" আছে তবে আমার একটি সংকলক ত্রুটি আছে, আমি কিছু পরীক্ষা করব একটি "কেবলমাত্র
সুইফ্ট

অবিশ্বাস্যরকম দুর্দান্ত। আমি sendEvent:আজকাল ওভাররাইডের জন্য ব্যবহারের ক্ষেত্রে কী তা সম্পর্কে আগ্রহী (আমি মনে করি এটি আইওএস 3 তে করা উচিত ...)
ম্যাট

4
যদি কেউ জানতে চায়, UIApplicationMainএবং main.swiftদ্য সুইফট ল্যাঙ্গুয়েজ রেফারেন্সের অ্যাট্রিবিউট বিভাগে নথিভুক্ত করা হয়েছে। বিকাশকারী.অ্যাপল.
com

ইঙ্গিতটির জন্য ধন্যবাদ, আমি 99% নিশ্চিত যে সুইফট ম্যানুয়ালটির প্রথম প্রকাশে এটি নথিভুক্ত করা হয়নি :-) তবে আমি আপনার তথ্য যুক্ত উত্তরটি আপডেট করব।
লম্বাক্স

4
দুর্দান্ত উত্তর। উপর XCode 6.3 বিটা, আপনি যে পেতে পারে C_ARGCএবং C_ARGVনাম পালটে করা হয়েছে Process.argcএবং Process.unsafeArgvযথাক্রমে। আপনার ইউআইএআইপ্লিকেশনমিন কলটি মূল.ইউইফ্ট ফাইলটিতে আপডেট করতে হবেUIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
টমাস ভারবিক

4

একটি বিকল্প এটি UIApplicationসাবক্লাসিংয়ের পরিবর্তে প্রসারিত করা। অ্যাপল প্রকাশিত আইবুক অনুসারে, সুইফটে এক্সটেনশনগুলি এটি করতে পারে:

গণিত বৈশিষ্ট্য এবং গণিত স্ট্যাটিক বৈশিষ্ট্য যুক্ত করুন উদাহরণ পদ্ধতি এবং প্রকারের পদ্ধতিগুলি সংজ্ঞায়িত করুন নতুন আরম্ভকারী সরবরাহ করুন সাবস্ক্রিপ্টগুলি সংজ্ঞায়িত করুন এবং নতুন নেস্টেড প্রকারগুলি সংজ্ঞায়িত করুন এবং ব্যবহার করুন একটি বিদ্যমান প্রকারকে একটি প্রোটোকলের সাথে সামঞ্জস্য করুন

এর উত্স: অ্যাপল ইনক। “দ্য সুইফ্ট প্রোগ্রামিং ভাষা।

সাবক্লাসিংয়ে আপনার প্রয়োজনীয়তা যদি UIApplicationসেই ক্ষমতাগুলি দ্বারা সন্তুষ্ট হয় তবে একটি এক্সটেনশন যাওয়ার উপায় হতে পারে।


4
চমৎকার পরামর্শ - উত্তর
ইমো

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 {
        //...
    }
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.