উদ্দেশ্য-সি: বিওএল বনাম বুল


192

আমি "নতুন টাইপ" BOOL( YES, NO) দেখেছি ।

আমি পড়েছি যে এই ধরণটি প্রায় চরের মতো।

পরীক্ষার জন্য আমি করেছি:

NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));

উভয় লগই "1" প্রদর্শন করে তা দেখতে ভাল (কখনও কখনও সি ++ বুলে একটি অন্তর্নিহিত হয় এবং এর আকার 4 হয়)

তাই আমি কেবল ভাবছিলাম যে বুল টাইপ বা কিছু নিয়ে কিছু সমস্যা আছে?

আমি কি গতি না হারিয়ে কেবল বুল (এটি কাজ করে বলে মনে হচ্ছে) ব্যবহার করতে পারি?

উত্তর:


198

সংজ্ঞা থেকে objc.h:

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

সুতরাং, হ্যাঁ, আপনি ধরে নিতে পারেন যে বিওএল একটি চর। আপনি (সি 99) boolপ্রকারটি ব্যবহার করতে পারেন তবে অ্যাপলের সমস্ত অবজেক্টিভ-সি ফ্রেমওয়ার্ক এবং বেশিরভাগ অবজেক্টিভ সি / কোকো কোড বোল ব্যবহার করে, তাই টাইপএফ যদি কখনও বিওওএল ব্যবহার করে পরিবর্তিত হয় তবে আপনি নিজেকে মাথা ব্যথা বাঁচাতে পারবেন।


17
"অ্যাপলের সমস্ত ফ্রেমওয়ার্ক" - সত্য নয়। CGGeometry.h এ দেখুন, বিশেষত: সিজিএনপিএলসুলি __CGPPointEqualToPoint (সিজিপয়েন্ট পয়েন্ট 1, সিজিপিয়েন্ট পয়েন্ট 2) {রিটার্ন পয়েন্ট 1.x == পয়েন্ট 2.x && point1.y == point2.y; }
এলিয়ট

58
@ এলিয়ট আপনি সঠিক আছেন সি ফ্রেমওয়ার্কের অনেকগুলি (কোরফাউন্ডেশন, কোরগ্রাফিকস ইত্যাদি) সি 99 ব্যবহার করে bool। অবজেক্টিভ-সি ফ্রেমওয়ার্কগুলির সমস্ত ব্যবহার BOOL
ব্যারি ওয়ার্ক

@ সিউর আপনি বিওএল কোড নমুনার সংজ্ঞাটি সম্পাদনা করেছেন তবে নীচের পাঠ্যটি একই থাকবে। এটি কিছুটা বিভ্রান্তিকর এবং ভুল। আমার উত্তর দেখুন।
কৌতুহল

বিভিন্ন আচরণ সম্পর্কে জানতে নীচে একবার দেখুন। NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)// এটি সর্বদা প্রদান করা হয় NO তবে একবার আমি এই (progressTime>=totalTime)মানটি boolটাইপ successকরলে এটি সঠিক ফলাফল দেয়। আমি এই আচরণ বুঝতে পারি না। আমি ব্যবহার করছি Xcode 7.xএবং iOSসংস্করণ ছিল 8.x। @ বেরি ওয়ার্ক
কামার শাদ

34

উপরে উল্লিখিত হিসাবে, BOOL একটি স্বাক্ষরিত চর। বুল - সি 99 স্ট্যান্ডার্ড (ইন্ট) থেকে টাইপ করুন।

বল - হ্যাঁ / না bool - সত্য / মিথ্যা

উদাহরণ দেখুন:

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");

এবং ফলাফল হয়

রিয়েল বি 1
রিয়েল বি 2
নট রিয়েল বি 2

নোট করুন যে বুল! = BOOL নীচের ফলাফলগুলি কেবল একবারই - বাস্তব বি 2

b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

আপনি যদি BOOL এ Bool রূপান্তর করতে চান তবে আপনার পরবর্তী কোডটি ব্যবহার করা উচিত

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

সুতরাং, আমাদের ক্ষেত্রে:

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

এবং তাই .. আমরা এখন কি পেতে? :-)


3
আপনি পার্শ্ববর্তী অপারেটর ব্যবহারের পরিবর্তে করতে পারেন !!b1। তাদের মধ্যে রূপান্তর করতে
রিচার্ড জে। রস তৃতীয়

1
'নট রিয়েল বি 2' আমার আইফোন এসই সিমুলেটারে মুদ্রিত নয়।
গ্যাবলার

12

লেখার সময় এটি আপত্তি.কমের সাম্প্রতিকতম সংস্করণ:

/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

এর অর্থ হ'ল -৪-বিট আইওএস ডিভাইস এবং ওয়াচওএসে BOOLঠিক একই জিনিসটি boolঅন্য সমস্ত ডিভাইসে যেমন রয়েছে (ওএস এক্স, ৩২-বিট আইওএস) এটি signed charকম্পাইলার পতাকা দ্বারাও ওভাররাইড করা যায় না-funsigned-char

এর অর্থ হ'ল এই উদাহরণ কোডটি বিভিন্ন প্ল্যাটফর্মগুলিতে আলাদাভাবে চলবে (এটি আমার পরীক্ষিত হয়েছে):

int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
    printf("i'm 64-bit iOS");
} else {
    printf("i'm 32-bit iOS");
}

BTW কখনো বরাদ্দ জিনিষ পছন্দ array.countকরতে BOOLপরিবর্তনশীল কারণ সম্ভাব্য মান টির মধ্যে% 0.4 সম্পর্কে নেতিবাচক হবে।


আপনি যখন আইওএস 32 বিট (আইফোন 5 সি ...) সংকলন করেন, আপনি কোনও বিওওএল (ইউআইভিউ অ্যানিমেশন ব্লক, যেমন) পাওয়ার জন্য সংজ্ঞায়িত কোনও ব্লকের পরামিতি হিসাবে বুল ব্যবহার করলে সংকলকটি একটি ত্রুটি বাড়িয়ে তুলবে। আমি আমার কোডের সর্বত্র সি ++ বুল এবং বিপিওএল
কে

8

আপনার অবজেক্টিভ-সি টাইপটি ব্যবহার করা উচিত BOOL। নেটিভ বুলিয়ান ডেটাটাইপের মতো কিছুই নেই, তাই সমস্ত সংকলকগুলিতে কোড সংকলন ব্যবহার করে তা নিশ্চিত হয়ে নিন BOOL। (এটি অ্যাপল-ফ্রেমওয়ার্কগুলিতে সংজ্ঞায়িত করা হয়েছে।


2
এটি কঠোরভাবে সঠিক নয়। ফ্রেমওয়ার্ক দ্বারা নয়, BOOLঅবজেক্টিভ সি ভাষা (এটি একটি objc/*.hশিরোনামের একটিতে ) দ্বারা সংজ্ঞায়িত করা হয়েছে । এছাড়াও, C99 (যা আমি ডিফল্ট বলে মনে করি) এর সাথে সংকলন করার পরে, সেখানে একটি নেটিভ বুলিয়ান টাইপ থাকে _Bool(বা boolযদি stdbool.hঅন্তর্ভুক্ত থাকে))
ড্রিমলাক্স

5

হ্যাঁ, বিওএল হ'ল একটি আপত্তিদস্তু

আমি বুল সম্পর্কে জানি না, যদিও। এটি একটি সি ++ জিনিস, তাই না? যদি এটি কোনও স্বাক্ষরিত চর হিসাবে সংজ্ঞায়িত হয় যেখানে 1 হ্যাঁ / সত্য এবং 0টি কোনও / মিথ্যা নয়, তবে আমি কল্পনা করি আপনি কোনটি ব্যবহার করবেন তা বিবেচ্য নয়।

যেহেতু বিওএল অবজেক্টিভ-সি-র অংশ, যদিও এটি স্পষ্টতার জন্য কোনও বিওএল ব্যবহার করা আরও বোধগম্য হয় (অন্যান্য উদ্দেশ্য-সি বিকাশকারীরা যদি কোনও বুলের ব্যবহার দেখতে পান তবে তারা হতবাক হয়ে যেতে পারে)।


6
_বুল সি 99 এ সংজ্ঞায়িত করা হয়েছে এবং স্ট্যান্ডার্ড শুল্কের স্ট্যান্ডার্ড শুল্কে ম্যাক্রো বুল সংজ্ঞায়িত করা হয়েছে (যা _বুলের কাছে প্রসারিত হয়) এবং সত্য / মিথ্যা এখানেও সংজ্ঞায়িত হয়েছে।
ব্রায়ান মিশেল

4

বুল এবং বিওওএল এর মধ্যে আরেকটি পার্থক্য হ'ল আপনি কী-মান পর্যবেক্ষণ করবেন বা যখন আপনি এই জাতীয় পদ্ধতি ব্যবহার করেন - [এনএসবজেক্ট ভেলফোর্কি:]।

সবাই যেমন এখানে বলেছে, বিওএল চর। এর মতো, এটি একটি এনএসএনম্বারে রূপান্তরিত হয়েছে যাতে একটি চর রয়েছে। 'এ' বা '\ 0' এর মতো নিয়মিত চর থেকে তৈরি কোনও এনএস নাম্বার থেকে এই অবজেক্টটি পার্থক্যযোগ্য। আপনি যে তথ্যটি মূলত একটি বোল ছিলেন তা আপনি সম্পূর্ণরূপে হারিয়ে ফেলেছেন।

যাইহোক, বুল একটি সিএফবুলিয়ান রূপান্তরিত হয়, যা এনএসএনবারের মতো আচরণ করে তবে এটি বস্তুর বুলিয়ান উত্স ধরে রাখে।

আমি মনে করি না যে এটি একটি বিওএল বনাম বুল বিতর্কের একটি যুক্তি, তবে এটি আপনাকে একদিন কামড় দিতে পারে।

সাধারণভাবে বলতে গেলে, আপনার BOOL এর সাথে যাওয়া উচিত, যেহেতু এটি কোকো / আইওএস এপিআই (C99 এর আগে নকশা করা এবং এর নেটিভ বুল টাইপের) সর্বত্র ব্যবহৃত হয়।


2

গৃহীত উত্তর সম্পাদনা করা হয়েছে এবং এর ব্যাখ্যাটি কিছুটা ভুল হয়ে গেছে। কোড নমুনা রিফ্রেশ করা হয়েছে, তবে নীচের পাঠ্যটি একই থাকে। আপনি এটি ধরে নিতে পারবেন না যে BOOL এখনকার জন্য একটি চরিত্র কারণ এটি আর্কিটেকচার এবং প্ল্যাটফর্মের উপর নির্ভর করে on সুতরাং, আপনি 32 বিট প্ল্যাটফর্মে কোড চালনা করে (উদাহরণস্বরূপ আইফোন 5) এবং @ এনকোড (বিওওএল) প্রিন্ট করলে আপনি "সি" দেখতে পাবেন। এটি একটি চরের ধরণের সাথে সম্পর্কিত । তবে আপনি যদি আইফোন 5 এস (bit৪ বিট) এ কোড চালান তবে আপনি "বি" দেখতে পাবেন। এটি একটি বুল টাইপের সাথে মিলে যায়


1

আমি এখানে কনভেনশনের বিরুদ্ধে যাই। আমি টাইপডেফের বেস টাইপ পছন্দ করি না। আমি মনে করি এটি একটি অকেজো নির্দেশিকা যা মান সরিয়ে দেয়।

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

4
ঠিক আছে ... আপনি আপনার ভাষার স্ট্যান্ডার্ড টাইপফের (চিন্তাভাবনা) এবং ( C99) এবং (ওবিজেসি) উভয়ই সেই বিভাগে আসতে পারবেন বলে আশা করা যায়। এবং যদি আপনার কোড টাইপফের পরিবর্তনের কারণে ব্যর্থ হয় তবে আপনি দোষারোপ করার জন্য আপনার কোডটি যেহেতু আপনি স্পষ্টতই টাইপডেফকে একটি অস্বচ্ছ জিনিস হিসাবে পরিচালনা করেননি তবে একটি প্ল্যাটফর্মের প্রয়োগের উপর নির্ভর করেছেন। (এতে লজ্জার কিছু নেই, এটি ঘটে তবে এটি দোষ দেওয়ার জন্য size_tboolBOOL
টাইপডেফ নয়

1
"স্ট্যান্ডার্ড" টাইপিডগুলি খুব স্ট্যান্ডার্ড বলে মনে হয় না (উদাহরণস্বরূপ কিছুক্ষণের জন্য এমএস পোস্টিক্স মানগুলি সমর্থন করে না ইত্যাদি)। আপনি যদি টাইপডেফ ব্যবহার না করেন তবে টাইপডেফগুলি পরিবর্তন করা বা বিভিন্ন সংকলকগুলিতে পৃথক হওয়ার সমস্যাটি দূর হয়।
জয়

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

2
@ জায়ে: দুঃখিত, এই "ভুল নির্দেশনা" কেন ভাল তা আমার ব্যাখ্যা করা উচিত ছিল। আমি একটি উদাহরণ দেওয়ার চেষ্টা করব: আপনি যদি টাইপডেফ বুলেটিয়ান সরাসরি ইন্ট বা চর ব্যবহার না করে সরাসরি ব্যবহার করেন তবে আপনি আপনার কোডটি ভঙ্গ না করে প্রতিটি প্ল্যাটফর্মে ভিন্ন ধরণের (যা এখনও কাজ করে) ব্যবহার করার অনুমতি দিচ্ছেন [কারণগুলি এটি পরিবর্তিত হয় তবে আমরা এমন একটি প্ল্যাটফর্মটি কল্পনা করতে পারি যেখানে একটি চর মেমরিতে মিসালাইন হতে পারে এবং এইভাবে ধীর হয় তাই এর পরিবর্তে কোনও বুলিয়ান ব্যবহার করা যেতে পারে]।
জোও পোর্তেলা

2
@Jay করা: "ভালো শব্দার্থবিদ্যা" আমি বলতে চাচ্ছি যে আপনি আপনার বুলিয়ান ঘোষণা যখন BOOL varnameপরিবর্তে char varnameএটি আরো সুস্পষ্ট যে যে পরিবর্তনশীল জন্য দুটি বৈধ মান true/ YESবা false/ NO
জোও পোর্তেলা

1

উপরে উল্লিখিত হিসাবে আপনার আর্কিটেকচারের উপর নির্ভর করে টাইপ BOOLহতে পারে unsigned char, যখন boolটাইপ হয় int। একটি সহজ পরীক্ষা বিওএল এবং বুল কেন আলাদা আচরণ করতে পারে তার পার্থক্যটি দেখায়:

bool ansicBool = 64;
if(ansicBool != true) printf("This will not print\n");

printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool);

BOOL objcBOOL = 64;
if(objcBOOL != YES) printf("This might print depnding on your architecture\n");

printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL);

if(!objcBOOL) printf("This will not print\n");

printf("! operator will zero objcBOOL %i\n", !objcBOOL);

if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL);

আপনার বিস্ময়ের if(objcBOOL != YES)জন্য কম্পাইলারটি 1 দ্বারা মূল্যায়ন করবে, যেহেতু YESপ্রকৃতপক্ষে অক্ষর কোড 1, এবং সংকলকের দৃষ্টিতে, অক্ষর কোড 64 অবশ্যই অক্ষর কোড 1 এর সমান নয় সুতরাং যদি বিবৃতিটি মূল্যায়ন করবে YES/true/1এবং নিম্নলিখিত লাইনটি হবে চালানো। তবে যেহেতু কোনও শূন্য boolপ্রকার সর্বদা 1 এর পূর্ণসংখ্যার মানটি মূল্যায়ণ করে তাই উপরের সমস্যাটি আপনার কোডকে প্রভাবিত করবে না। Objective-C BOOLটাইপ বনাম টাইপটি ব্যবহার করতে চাইলে নীচে কয়েকটি ভাল টিপস দেওয়া হল ANSI C bool:

  • সর্বদা মান YESবা NOমান এবং অন্য কিছু বরাদ্দ করুন ।
  • অপ্রত্যাশিত ফলাফল এড়াতে BOOLডাবল নট !!অপারেটর ব্যবহার করে ধরণের রূপান্তর করুন ।
  • YESব্যবহারের জন্য পরীক্ষা করার সময় if(!myBool) instead of if(myBool != YES)এটি !অপারেটরটি ব্যবহার করা অনেক পরিষ্কার এবং প্রত্যাশিত ফলাফল দেয়।

1

এছাড়াও, কাস্টিংয়ের পার্থক্য সম্পর্কে সচেতন হন, বিশেষত বিটমাস্কের সাথে কাজ করার সময়, স্বাক্ষরিত চরটিতে castালাইয়ের কারণে:

bool a = 0x0100;
a == true;  // expression true

BOOL b = 0x0100;
b == false; // expression true on !((TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH), e.g. MacOS
b == true;  // expression true on (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH

যদি বিওএল একটি বুলের পরিবর্তে একটি স্বাক্ষরিত চর হয় তবে 0x0100 থেকে BOOL এ castালাই সেট সেটটি বিট করে দেয় এবং ফলাফলটির মান 0 হয়।

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