Sobes.tech
Junior

რა არის დახურვა?

sobes.tech AI

პასუხი AI-სგან

Swift-এ ক্লোজার (closure) হল একটি স্বনির্ভর কার্যকারিতা ব্লক ({}), যা কোডে স্থানান্তরিত এবং ব্যবহৃত হতে পারে। ক্লোজারগুলি যে কোনও ধ্রুবক বা পরিবর্তনশীলের রেফারেন্স ক্যাপচার করতে এবং সংরক্ষণ করতে পারে, যেখানে তারা সংজ্ঞায়িত হয়েছিল।

ব্যবহারের উদাহরণ:

  • ফাংশনের আর্গুমেন্ট হিসেবে (উদাহরণস্বরূপ, সম্পন্ন হ্যান্ডলারসমূহ)।
  • সংগ্রহের পুনরাবৃত্তির সময় আচরণ নির্ধারণের জন্য (উদাহরণস্বরূপ, map, filter, reduce, sorted পদ্ধতি ব্যবহার করে)।
  • কোডের দেরিতে কার্যকর করার জন্য।

সিনট্যাক্স:

// মৌলিক সিনট্যাক্স
{ (প্যারামিটারসমূহ) -> প্রত্যাবর্তনপ্রকার in
    বিবৃতি
}

// ক্লোজারটির উদাহরণ, যা Int গ্রহণ করে এবং String ফেরত দেয়
let integerToString: (Int) -> String = { (number: Int) -> String in
    return "সংখ্যা: \(number)"
}

বৈশিষ্ট্য:

  • স্বয়ংক্রিয়ভাবে পরিবর্তনশীল ক্যাপচার (capturing values)।
  • প্যারামিটার এবং প্রত্যাবর্তন মানের স্পষ্ট উল্লেখ ছাড়াই ক্লোজার সংজ্ঞায়িত করার সুবিধা (সিনট্যাক্সিক সুগার)।
  • সংক্ষিপ্ত নামের প্যারামিটার ব্যবহার ($0, $1 ইত্যাদি)।
  • ক্লোজার সাইনট্যাক্স (trailing closure syntax)।

পরিবর্তনশীল ক্যাপচার:

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

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0 // বাইরের পরিবেশ থেকে পরিবর্তনশীল
    let incrementer: () -> Int = { // ক্লোজার
        runningTotal += amount // ক্যাপচার করে runningTotal এবং amount
        return runningTotal
    }
    return incrementer
}

let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // আউটপুট: 10
print(incrementByTen()) // আউটপুট: 20

ক্যাপচার তালিকা:

এগুলি স্পষ্টভাবে নির্দেশ করে যে পরিবর্তনশীলগুলি কিভাবে ক্যাপচার করা উচিত - মান দ্বারা বা লিঙ্ক দ্বারা, এবং শক্তিশালী লিঙ্ক চক্র (retain cycles) এড়ানোর জন্য।

class MyClass {
    var value = 0

    lazy var myClosure: () -> Void = { [self, value] in // self লিঙ্ক দ্বারা, value মান দ্বারা
        print("self.value এর মান: \(self.value)")
        print("ক্যাপচারকৃত মান: \(value)")
    }

    deinit {
        print("MyClass এর ইনস্ট্যান্স মুক্ত হয়েছে")
    }
}

শক্তিশালী লিঙ্ক চক্র এড়ানোর জন্য [weak self] বা [unowned self] ব্যবহার করা হয়:

class ViewController {
    var dataFetcher: DataFetcher?

    func fetchData() {
        dataFetcher?.fetch { [weak self] result in // দুর্বল লিঙ্ক self-এ
            guard let self = self else { return } // অস্তিত্ব পরীক্ষা
            // ফলাফল প্রক্রিয়াকরণ
        }
    }
}

class DataFetcher {
    var completionHandler: ((Result<String, Error>) -> Void)?

    func fetch(completion: @escaping (Result<String, Error>) -> Void) {
        self.completionHandler = completion
        // অ্যাসিঙ্ক্রোনাস অপারেশন...
    }
}