লজিকাল এবং অপারেটর &&


93

আমরা জানি যে আমরা একটি if letবিবৃতি শর্টহ্যান্ড হিসাবে ব্যবহার করতে পারি thenচ্ছিক শিবিরের জন্য পরীক্ষা করে নিরীক্ষণ করুন।

যাইহোক, আমি লজিকাল অ্যান্ড অপারেটর ব্যবহার করে এটি একটি অন্য অভিব্যক্তির সাথে একত্রিত করতে চাই &&

সুতরাং, উদাহরণস্বরূপ, এখানে আমি আন-মোড়ক করতে alচ্ছিক শৃঙ্খলা করি এবং rootচ্ছিকভাবে আমার রুটভিউকন্ট্রোলারটিকে ট্যাববারকন্ট্রোলারে ডাউনকাস্ট করি। তবে বক্তব্যগুলি বাসা বাঁধার চেয়ে আমি সেগুলি একত্রিত করতে চাই।

if let tabBarController = window!.rootViewController as? UITabBarController {
    if tabBarController.viewControllers.count > 0 {
        println("do stuff")
     }
 }

সম্মিলিত দান:

if let tabBarController = window!.rootViewController as? UITabBarController &&
    tabBarController.viewControllers.count > 0 {
        println("do stuff")
     }
}

উপরোক্ত সংকলন ত্রুটিটি অমীমাংসিত সনাক্তকারী 'ট্যাববারকন্ট্রোলার' ব্যবহার করে

সরলকরণ:

if let tabBarController = window!.rootViewController as? UITabBarController && true {
   println("do stuff")
}

এটি একটি সংকলন ত্রুটি দেয় শর্তাধীন বাঁধাইয়ের বাউন্ড মানটি অবশ্যই ptionচ্ছিক ধরনের হতে হবে । বিভিন্ন সিনট্যাকটিক ভিন্নতার চেষ্টা করে, প্রতিটি পৃথক সংকলক ত্রুটি দেয়। অর্ডার এবং প্রথম বন্ধনীগুলির বিজয়ী সংমিশ্রণটি আমি এখনও খুঁজে পাই।

সুতরাং, প্রশ্নটি হল, এটি কি সম্ভব এবং যদি তাই হয় তবে সঠিক বাক্য গঠন কী?

মনে রাখবেন যে, আমি একজন সঙ্গে এই কাজ করতে চান ifবিবৃতি না একটি switchবিবৃতি অথবা একটি তিন ?অপারেটর।


প্রশ্নটিতে ত্রুটি বার্তা সরবরাহ করা সর্বদা একটি ভাল ধারণা।
জাফ

যারা var foo : Int? = 10; if let bar = foo { if bar == 10 { println("Great success!") }}
এটির

ব্যবহার করার সময় ত্রুটি বার্তাটি if let bar = foo && bar == 10হয় Use of unresolved identifier "bar"( barঅবশ্যই দ্বিতীয়টিতে ))
ডার্কডাস্ট

কেবলমাত্র একটি নোট যে আমি নীচের মতো করে Objective C এর ফার্স্টঅবজেক্টটি ব্যবহার করে উপরের উদাহরণটি সংক্ষিপ্ত করতে সক্ষম হয়েছি: যদি নেভিগেশনকন্ট্রোলার = ট্যাববারট্রোলট্রিয়রভিউ কন্ট্রোলার.ব্রিজটোঅবজেক্টিভি () প্রথম ফার্স্ট অবজেক্ট? UINavigationController {
ম্যাক্স ম্যাকলিয়ড

4
1. bridgeToObjectiveCবিটা 5 এ চলে গেছে (এবং সম্ভবত সম্ভবত সাধারণ ব্যবহারের উদ্দেশ্যে নয়)। ২. যাইহোক firstসুইফটের অন্তর্নির্মিত Arrayধরণের একটি পদ্ধতি রয়েছে ।
রিক্সার

উত্তর:


144

সুইফট ১.২ হিসাবে, এটি এখন সম্ভবসুইফট 1.2 এবং Xcode 6.3 বিটা রিলিজ নোট রাজ্য:

যদি আসুন তবে আরও শক্তিশালী alচ্ছিক আন-র্যাপিং - যদি আইফ লেট কনস্ট্রাক্ট একসাথে একাধিক বিকল্প আন-র্যাপ করতে পারে, পাশাপাশি হস্তক্ষেপকারী বুলিয়ান শর্তকে অন্তর্ভুক্ত করে। এটি আপনাকে শর্তযুক্ত নিয়ন্ত্রণ প্রবাহকে অপ্রয়োজনীয় বাসা ছাড়াই প্রকাশ করতে দেয়।

উপরের বিবৃতি দিয়ে বাক্য গঠনটি তখন হবে:

if let tabBarController = window!.rootViewController as? UITabBarController where tabBarController.viewControllers.count > 0 {
        println("do stuff")
}

এটি whereধারা ব্যবহার করে ।

আরেকটি উদাহরণ এই সময় ভোটদান AnyObjectথেকে Int, ঐচ্ছিক unwrapping, এবং চেক যে মোড়ানো ঐচ্ছিক শর্ত পূরণ করে:

if let w = width as? Int where w < 500
{
    println("success!")
}

যারা এখন সুইফ্ট 3 ব্যবহার করছেন তাদের "কই" কমা দ্বারা প্রতিস্থাপন করা হয়েছে। সমতুল্য তাই হবে:

if let w = width as? Int, w < 500
{
    println("success!")
}

4
এটি নির্বাচিত উত্তর আসা উচিত।
ফ্রান্সিস.বিউচ্যাম্প

হ্যাঁ এখন এটি পরিবর্তিত হয়েছে। ব্রায়ানের উত্তর তখন সঠিক ছিল
ম্যাক্সলিয়ড

59

ইন সুইফট 3 ম্যাক্স ম্যাকলিয়ড উদাহরণ ভালো দেখাবে:

if let tabBarController = window!.rootViewController as? UITabBarController, tabBarController.viewControllers.count > 0 {
    println("do stuff")
}

দ্বারা whereপ্রতিস্থাপিত হয়েছিল,


10
সুতরাং, && এর জন্য যা আছে || ?
jeet.chanchawat

9
@ jeet.chanchawat যৌক্তিক বা এই প্রসঙ্গে কোন মানে নেই in if letকেবলমাত্র proceedচ্ছিকভাবে সফলভাবে মোড়ানো না হয়ে অগ্রসর হতে পারে এবং নতুন ভেরিয়েবলের জন্য নির্ধারিত হয়। যদি আপনি বলে থাকেন OR <something else>তবে আপনি সহজেই এর পুরো উদ্দেশ্যটিকে বাইপাস করতে পারেন if let। লজিক্যাল ওআর জন্য, কেবলমাত্র একটি স্বাভাবিক ifএবং দেহের অভ্যন্তরে এই বিষয়টি নিয়ে ডিল করুন যে প্রথম অবজেক্টটি এখনও সেই সময়ে optionচ্ছিক (মোড়কে আবদ্ধ নয়)।
jbbott

37

ম্যাক্সের উত্তর সঠিক এবং এটি করার একটি উপায়। যদিও এইভাবে লেখার সময় লক্ষ্য করুন:

if let a = someOptional where someBool { }

someOptionalঅভিব্যক্তি প্রথম সমাধান হবে। যদি এটি ব্যর্থ হয় তবে someBoolঅভিব্যক্তিটি মূল্যায়ন করা হবে না (শর্ট সার্কিট মূল্যায়ন, যেমনটি আপনি আশা করেছিলেন)।

আপনি যদি এটিকে অন্য উপায়ে লিখতে চান তবে এটি করা যেতে পারে:

if someBool, let a = someOptional { }

এই ক্ষেত্রে someBoolপ্রথম মূল্যায়ন করা হয়, এবং কেবল যদি এটা সত্য মূল্যায়ণ হয় someOptionalঅভিব্যক্তি মূল্যায়ন করেন।



4

এটা সম্ভব নয়.

সুইফ্ট ব্যাকরণ থেকে

একটি বিবৃতি যদি গ্র্যামার

if- বিবৃতি → যদি -শর্তের কোড-ব্লক অন্য-ক্লোজোপ্ট

if-conditions → ভাব | ঘোষণা

অন্য-ধারা → অন্য কোড-ব্লক অন্য যদি বিবৃতি

একটি বিবৃতিতে যে কোনও শর্তের মান বুলিয়ান টাইপ প্রোটোকলের সাথে সঙ্গতিপূর্ণ এমন একটি টাইপ থাকতে হবে। শর্তটি একটি alচ্ছিক বাঁধাইয়ের ঘোষণাও হতে পারে, যেমনটি ptionচ্ছিক বাঁধাইয়ের ক্ষেত্রে আলোচনা করা হয়েছে

যদি-শর্তটি অবশ্যই প্রকাশের হয় বা ঘোষণা । আপনার প্রকাশ এবং ঘোষণা উভয়ই থাকতে পারে।

let foo = bar এটি একটি ঘোষণা, এটি মান হিসাবে মান মানায় না BooleanType । এটি একটি ধ্রুবক / পরিবর্তনশীল ঘোষণা করে foo

আপনার মূল সমাধানটি যথেষ্ট ভাল, শর্তগুলির সাথে একত্রিত হয়ে এটি আরও অনেক বেশি পাঠযোগ্য।


তবে অবশ্যই "যদি যাক" - যা বৈধ সুইফট বাক্য গঠন - এটি উভয়ই একটি অভিব্যক্তি এবং একটি ঘোষণা?
সর্বাধিক ম্যাকলিয়ড

@ ম্যাক্সম্যাকলিউড let foo = barহ'ল ঘোষণা নয়। আপনি পারবেন নাlet boolValue = (let foo = bar)
ব্রায়ান চেন

ঠিক আছে তবে সুইফট গাইড, পৃষ্ঠা 11 এর উদ্ধৃতি দিতে উদাহরণস্বরূপ: যদি নাম = alচ্ছিক নাম দেওয়া হয়। alচ্ছিক নাম অবশ্যই একটি অভিব্যক্তি হতে হবে যার মাধ্যমে optionচ্ছিক নামটি optionচ্ছিক না হলে এটি সত্য হিসাবে মূল্যায়ন করে। বিবৃতিটির দ্বিতীয় অংশটি তখন কিক্স করে যার মাধ্যমে মোড়কযুক্ত alচ্ছিককে নাম নির্ধারিত করা হয়। সুতরাং, প্রশ্নটি হ'ল, যদি "alচ্ছিক নাম একটি alচ্ছিক না হয়" একটি অভিব্যক্তি হয়, তবে কি এটি একটি লজিক্যাল এ্যান্ডের সাথে প্রসারিত করা যেতে পারে। বিটিডব্লু আমি মনে করি আপনি সম্ভবত ঠিক আছেন যে এটি করা যায় না।
সর্বোচ্চ ম্যাকলিউড

-1

আমি মনে করি আপনার মূল প্রস্তাবটি খুব খারাপ নয়। এ (মেসিয়ার) বিকল্পটি হ'ল:

if ((window!.rootViewController as? UITabBarController)?.viewControllers.count ?? 0) > 0 {
    println("do stuff")
}

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