কীভাবে একজন দ্রুতগতিতে anচ্ছিক বন্ধ করতে পারেন?


93

আমি সুইফটে একটি যুক্তি ঘোষণার চেষ্টা করছি যা একটি alচ্ছিক বন্ধ হয়ে যায়। আমি যে ফাংশনটি ঘোষণা করেছি তা দেখতে এরকম দেখাচ্ছে:

class Promise {

 func then(onFulfilled: ()->(), onReject: ()->()?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

}

তবে সুইফট অভিযোগ করে যে "শর্তসাপেক্ষে বাউন্ডের মান অবশ্যই একটি typeচ্ছিক প্রকার" হওয়া উচিত যেখানে "যদি দেওয়া হয়" ঘোষণা করা হয়।


পরামিতিগুলির সাথে শুধুমাত্র একটি ক্লোজার ব্যবহার বিবেচনা করুন।
25:39 জুলাই'র

উত্তর:


113

বন্ধনীগুলিতে আপনার closureচ্ছিক বন্ধ হওয়া উচিত। এটি ?অপারেটরটিকে যথাযথভাবে স্কোপ করবে ।

func then(onFulfilled: ()->(), onReject: (()->())?){       
    if let callableRjector = onReject {
      // do stuff! 
    }
 }

বন্ধনীতে এটি বন্ধ করার যুক্তিটি কী তা আপনি জানেন?
মার্কোস্কো

5
সম্ভবত অস্পষ্টতা দূর করতে। Alচ্ছিক বন্ধের যদি কোনও রিটার্ন মান থাকে তবে এটি কী ()->Int?অর্থ তা নিয়ে বিভ্রান্তি পেতে পারে ।
সেজার

4
এছাড়াও, সুইফট বইটি থেকে: "alচ্ছিক ধরণের ঘোষণার সময়, সঠিকভাবে স্কোপ করার জন্য বন্ধনী ব্যবহার করার বিষয়ে নিশ্চিত হন? অপারেটর. উদাহরণস্বরূপ, পূর্ণসংখ্যার একটি alচ্ছিক অ্যারে ঘোষণা করতে, এনটোটেশনটি টাইপ করুন (Int []) ?; লিখছেন ইন []? একটি ত্রুটি জন্মায়। "
সেজার

@ সিজার আপনি "whyচ্ছিক বন্ধ" কেন এবং কোথায় ব্যবহার করবেন দয়া করে কিছুটা ব্যাখ্যা করতে পারেন, আমি এটি জানতে আগ্রহী।
iLearner

@ সিজার এই মুহুর্তে কোনও ম্যাকে নেই তাই আমার বাক্যবিন্যাসটি কিছুটা বন্ধ হয়ে যেতে পারে তবে মনে রাখবেন এটি ?আসলেই চিনির জন্য Optional<T>, সুতরাং আপনি `ফানক (লিখুন: () -> (), অনরেক্ট: <চ্ছিক <() -> ()>) {`তবে আপনার অতিরিক্ত প্রয়োজন হবে না (), যদিও আইএমও ()?প্রিটিয়ার। এছাড়াও আপনি এটিকে টাইপালিয়ার মতো সুন্দর করে তুলতে পারেন typealias RejectHandler = () -> () func then(onFulfilled: ()->(), onReject: RejectHandler?) {
অ্যান্ড্রু কার্টার

63

কোডটিকে আরও ছোট করার জন্য আমরা যখন কল করার সময় প্যারামিটার এবং alচ্ছিক চেইনের nilজন্য ডিফল্ট মান হিসাবে ব্যবহার করতে পারি:onReject?()

func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
  onReject?()
}

আমরা onRejectযখন thenফাংশন বলি তখন এইভাবে আমরা প্যারামিটার বাদ দিতে পারি ।

then({ /* on fulfilled */ })

onRejectপ্যারামিটারটিকে thenকার্যক্রমে পাঠাতে আমরা ট্রেলিং ক্লোজার সিনট্যাক্সটিও ব্যবহার করতে পারি :

then({ /* on fulfilled */ }) {
  // ... on reject
}

এটি সম্পর্কে একটি ব্লগ পোস্ট এখানে ।


34

যেহেতু আমি ধরে নিচ্ছি যে এই "alচ্ছিক" বন্ধটি কেবল কিছু করা উচিত নয়, আপনি খালি ক্লোজার সহ একটি পরামিতি ডিফল্ট মান হিসাবে ব্যবহার করতে পারেন:

func then(onFulfilled: ()->(), onReject: ()->() = {}){       
    // now you can call your closures
    onFulfilled()
    onReject()
}

এই ফাংশনটি এখন onRejectকলব্যাকের সাথে বা ছাড়াও বলা যেতে পারে

then({ ... })
then({ ... }, onReject: { ... })

Optionals?এখানে সুইফটের দুর্দান্ত কাজটির দরকার নেই !


এটি দুর্দান্ত সমাধান!
রোল্যান্ড টি।

6

সম্ভবত এটি একটি পরিষ্কার উপায়। বিশেষত যখন ক্লোজারটিতে জটিল পরামিতি রয়েছে।

typealias SimpleCallBack = () -> ()

class Promise {

func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){       
    if let callableRjector = onReject {
        // do stuff! 
    }
}

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