সুইফট 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.