আমি যদি সুইফটে স্টেটমেন্ট দিয়ে রেঞ্জ অপারেটরটি ব্যবহার করতে পারি?


196

এটি কি ব্যাপ্তি অপারেটর ...এবং ..<যদি বিবৃতি সহ ব্যবহার করা সম্ভব । মায়ি এরকম কিছু:

let statusCode = 204
if statusCode in 200 ..< 299 {
  NSLog("Success")
}

উত্তর:


426

আপনি "প্যাটার্ন-ম্যাচ" অপারেটরটি ব্যবহার করতে পারেন ~=:

if 200 ... 299 ~= statusCode {
    print("success")
}

বা এক্সপ্রেশন প্যাটার্ন সহ একটি স্যুইচ-বিবৃতি (যা অভ্যন্তরীণভাবে প্যাটার্ন-ম্যাচ অপারেটরটি ব্যবহার করে):

switch statusCode {
case 200 ... 299:
    print("success")
default:
    print("failure")
}

নোট করুন যে ..<উপরের মান বাদ দেয় এমন একটি পরিসীমা চিহ্নিত করে যাতে আপনি সম্ভবত চান 200 ... 299বা চান 200 ..< 300

অতিরিক্ত তথ্য: উপরের কোডটি যখন এক্সকোড 6.৩ এ সংকলিত হয় তখন অপ্টিমাইজেশন স্যুইচ করা থাকে, তারপরে পরীক্ষার জন্য

if 200 ... 299 ~= statusCode

আসলে কোনও ফাংশন কল মোটেই উত্পন্ন হয় না, কেবল তিনটি সংসদীয় নির্দেশ:

addq    $-200, %rdi
cmpq    $99, %rdi
ja  LBB0_1

এটি হ'ল একই সমাবেশ কোড যা এর জন্য উত্পন্ন হয়

if statusCode >= 200 && statusCode <= 299

আপনি এটি দিয়ে যাচাই করতে পারেন

xcrun -sdk macosx swiftc -O -emit-সমাবেশ main.swift

সুইফট 2 হিসাবে, এটি হিসাবে লেখা যেতে পারে

if case 200 ... 299 = statusCode {
    print("success")
}

if- স্টেটমেন্টের জন্য সদ্য প্রবর্তিত প্যাটার্ন-ম্যাচিং ব্যবহার করে। সুইফট 2 - "যদি" তে প্যাটার্নের মিলও দেখুন ।


1
শীতল, এই ও (1)? এছাড়াও, দুর্দান্ত হবে যদি উদাহরণস্বরূপ স্কেলার মতো সুইচ স্টেটমেন্টগুলির জন্য স্বিফ্টের একটি ছোট হাত ছিল। তবে আপনি যে সবসময় সুইফটে সংকলনের সময় সমস্ত সম্ভাবনাগুলি পরিচালনা করতে বাধ্য হয়েছেন তা প্রদত্ত, এটি সত্যিই সম্ভব হবে না।
আকাশে

2
@ স্কাই: উত্পন্ন সমাবেশ কোড থেকে একজন দেখতে পাবে যে একটি লাইব্রেরি ফাংশন func ~= (Range<A>, A) -> Boolবলা হয়। আমি ধরে নেব যে এই ফাংশনটি ও (1) এর সাথে কাজ করে।
মার্টিন আর

4
@ ডাউনভোটার: কিছু ব্যাখ্যা দেওয়ার মত মন্তব্যটি চমৎকার হবে, যাতে আমি উত্তরটি উন্নত করতে বা ঠিক করতে পারি ...
মার্টিন আর

1
@ মার্টিনআর আপনি কীভাবে সংসদীয় ভাষাতে ডাকা কোন ফাংশনটি জানতে পারবেন? শীতল উত্তরের জন্য +1
কোডার

3
@ কোডেস্টার: আমি কমান্ড লাইনে কোডটি সংকলন xcrun -sdk macosx swift -emit-assembly main.swiftকরে সমাবেশ কোডটি পরিদর্শন করেছি insp তারপরে আমি xcrun swift-demangle ...ডাকা ফাংশনটির নামটি ডি-ম্যাঙ্গেল করতাম । - দুর্ভাগ্যক্রমে, এক্সকোড এখনও সুইফ্ট ফাইলগুলির জন্য সমাবেশ কোড তৈরি করতে পারে না, সম্ভবত এটি পরবর্তী সংস্করণে কাজ করবে।
মার্টিন আর

95

এই সংস্করণটি প্যাটার্ন মিলের চেয়ে বেশি পঠনযোগ্য বলে মনে হচ্ছে:

if (200 ... 299).contains(statusCode) {
    print("Success")
}

2
ঠিক আমি কী সন্ধান করছিলাম
নাজিম কেরিমবকভ

আমি এই ত্রুটিটি পেয়েছি => আপারবাউন্ড <লোয়ারবাউন্ড
আলফি

9

এটি একটি পুরানো থ্রেড, তবে আমার কাছে মনে হচ্ছে আমরা এটি অতিরিক্ত চিন্তা করছি। আমার কাছে মনে হয় এর সেরা উত্তরটি ন্যায্য

if statusCode >= 200 && statusCode <= 299

নেই

if 200 > statusCode > 299

যে ফর্মটি সম্পর্কে আমি অবগত রয়েছি এবং অন্য প্রস্তাবিত সমাধানগুলি ফাংশন কলগুলি করছে যা পড়া খুব শক্ত এবং এটি কার্যকর করতে ধীর হতে পারে। প্যাটার্ন মিলের পদ্ধতিটি জানার জন্য একটি দরকারী কৌশল, তবে এই সমস্যার জন্য এটি বেশ উপযুক্ত বলে মনে হচ্ছে।

সম্পাদনা:

ব্যক্তিগতভাবে, আমি প্যাটার্ন ম্যাচ অপারেটরটিকে ঘৃণ্য বলে মনে করি এবং আশা করি সংকলকটি if x in 1...100সিনট্যাক্স সমর্থন করবে । এটি তুলনায় অনেক বেশি স্বজ্ঞাত এবং পড়া সহজif 1...100 ~= x


1
আপনি ঠিক বলেছেন যে এই সংস্করণটি পড়া ভাল, আমি কেবল "স্পষ্টতর অপারেটরটি ব্যবহার করা সম্ভব?" - তবে এক্সকোড .3.৩ বিটা (অনুকূলিত মোডে) ঠিক তিনটি সমাবেশ নির্দেশনা উত্পন্ন করে if 200 ... 299 ~= statusCode, কোনও ফাংশন কল নেই :)
মার্টিন আর

13
প্রকৃতপক্ষে একই সমাবেশ কোডটি if 200 ... 299 ~= statusCodeদেয়if statusCode >= 200 && statusCode <= 299
মার্টিন আর

6
এই শর্তসাপেক্ষে একটি সমালোচনামূলক বিভাগে না থাকলে যা প্রতি সেকেন্ডে কয়েক হাজার বার পরিদর্শন করা হয়, ফাংশন কল ওভারহেড সম্পর্কে চিন্তিত হ'ল অকাল অপটিমাইজেশন। তবুও, আমি কি একটি ফাংশন কল সে সম্বন্ধে আরো চিন্তা চাই করছেন এটি আহ্বান খরচ বদলে। যদিও নির্বিশেষে কোনও খরচ নেই তা প্রমাণ করার জন্য দুর্দান্ত কাজ @ মার্টিনআর।
রিক্সার

1
@ চালক, যথেষ্ট সত্য। আমি এখনও অভ্যাসের বিষয় হিসাবে অক্ষমগুলির তুলনায় দক্ষ নির্মাণকে বেশি প্রাধান্য দিই (পাঠযোগ্যতাটি একইরূপে ধরে নিই)। আমি এতে আমার বেশি সময় নষ্ট করি না এমনভাবে নয়, তবে এটি বিভিন্ন পদ্ধতির ব্যয় কী তা জানার জন্য অর্থ প্রদান করে।
ডানকান সি

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

3

আমি 401 ব্যতীত 4xx ত্রুটি পরীক্ষা করতে চেয়েছিলাম wanted কোডটি এখানে:

let i = 401

if 400..<500 ~= i, i != 401 {
    print("yes")
} else {
    print("NO")
}

2

আমি রেঞ্জ। কনটেনস () অপারেটরটিকেও পছন্দ করেছি, যতক্ষণ না এটির প্রয়োগ কার্যকর হয় না - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/

আমরা রেঞ্জ ব্যবহার করে এক্স <0 শর্তটি উপস্থাপন করতে পারি: (অন্তঃমিনি .. <0)। কনটেন্টস (এক্স) হুবহু সমতুল্য। যদিও এটি যথেষ্ট ধীরে ধীরে। (_ :) সমন্বিত ডিফল্ট বাস্তবায়ন পুরো সংগ্রহটিকে ঘুরিয়ে দেয় এবং সবচেয়ে খারাপ অবস্থায় লুপ নয়টি পঞ্চম বার কার্যকর করা সস্তা নয়।

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