সুইফট 3-এ সম্পত্তি সহ সিঙ্গলটন


88

অ্যাপল এর কোকো এবং অবজেক্টিভ সি নথির সাথে সুইফট ইউজিং সুইফটে (সুইফ্ট 3-র জন্য আপডেট হয়েছে) তারা সিঙ্গেলটন প্যাটার্নের নিম্নলিখিত উদাহরণ দেয়:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()

        // setup code

        return instance
    }()
}

আসুন কল্পনা করুন যে এই সিঙ্গলটনের স্ট্রিংগুলির একটি পরিবর্তনশীল অ্যারে পরিচালনা করা দরকার। আমি কীভাবে / কোথায় সেই সম্পত্তি ঘোষণা করব এবং নিশ্চিত করব যে এটি খালি [String]অ্যারেতে সঠিকভাবে আরম্ভ করা হবে ?

উত্তর:


236

আমার জন্য এটি সর্বোত্তম উপায়, দীক্ষাটি ব্যক্তিগত করুন। সুইফট 3 \ 4 \ 5 সিনট্যাক্স

// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray = [String]()

}

4
আমি এই উত্তরটি অগ্রাহ্য করেছি, তবে সুইফট 3 সিনট্যাক্সের সাথে মেলে, "শেয়ারডআইনস্ট্যান্স" কেবলমাত্র "ভাগ" করা উচিত।
— বি-র‌্যাড

4
যদি আপনি সুইফট 2 থেকে সুইফট 3 তে
— কোনও রেগ্রেশন

4
ভাগ করার পরে টাইপ বাদ দেওয়া যেতে পারে, তাই না? static let shared = Singleton()
— ক্রিসউইলো

4
@ ইয়ানিকস্টেফ আপনাকে লিখতে static let shared: Singleton = Singleton()হবে না এর পরিবর্তে আপনি কেবল লিখতে পারেনstatic let shared = Singleton()
— ক্রিসুইলো

4
@ রোমানএন না আপনি আর ডি ওভাররাইড করতে পারবেন না কারণ এটি কোনও শ্রেণীর উত্তরাধিকারসূত্রে নেই। আপনি যদি এটি করতে পারেন, উদাহরণস্বরূপ final class Singleton: NSObject { private override init() { } }
— ইয়ানস্টেফ

59

আপনি এটির মতো একটি খালি অ্যারে শুরু করতে পারেন।

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton(array: [])
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]

    //MARK: Init

    init( array : [String]) {
        emptyStringArray = array
    }
}

অথবা আপনি যদি কোনও ভিন্ন পদ্ধতির পছন্দ করেন তবে এটি ভাল করবে।

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton()
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]? = nil

    //MARK: Init

    convenience init() {
        self.init(array : [])
    }

    //MARK: Init Array

    init( array : [String]) {
        emptyStringArray = array
    }
}

এই পদ্ধতিটি কোনও এক্সটেনশনে কাজ করে না? extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
— অ্যান্ড্রু

4
অ্যাপল class varআইওএস 10-এ সিঙ্গলেটনের জন্য ব্যবহার করে এমন আকর্ষণীয় (উদাঃ ইউআইএপ্লিকেশন)। তাদের বাস্তবায়ন কি একই হবে?
— jjatie

4
আমি সিঙ্গেলটন ডিআইডি পদ্ধতিগুলিকে পছন্দ privateনা করেও পদ্ধতি হিসাবে পছন্দ করি internal। এটি অন্যদের এই শ্রেণীর জন্য ডিফল্ট '()' আরম্ভকারী ব্যবহার করতে বাধা দেয়।
— কুমার সি

4
@KumarC তুমি সঠিক, এটা সমস্যা সমাধানের করবে না যদি আমরা একটি যোগ privateমধ্যে init।

আপনি কি আরও তথ্য আনতে পারেন?
— ডোমিনিক ভায়াল

30

আপেলের ডকুমেন্টেশন অনুসারে: সুইফ্টে আপনি কেবল স্ট্যাটিক ধরণের সম্পত্তি ব্যবহার করতে পারেন, যা একসাথে একাধিক থ্রেড জুড়ে অ্যাক্সেস পাওয়া সত্ত্বেও অলসভাবে কেবল একবারই শুরু করার নিশ্চয়তা দেওয়া হয় ।

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

সূচনা পদ্ধতি সহ:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}

4
কেন উদ্যোগ () ব্যক্তিগত নয়?
— XcodeNOOB

0

যে কোনও সূচনাটি একটি ডিআইডি পদ্ধতিতে করা হত। একটি সিঙ্গলটন এবং একটি নন-সিঙ্গলটনের মধ্যে এখানে কোনও পার্থক্য নেই।


26
একটি অতিরিক্ত কোড স্নিপেট যা সরাসরি প্রশ্নের উত্তর দেয় এই উত্তরটি আরও সহায়ক করে তুলবে।
— রেদা লেমেডেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.