objective c - উদ্দেশ্য-সি একটি টাইপডফ enum কি?




objective-c enums (10)

আমি মনে করি না মৌলিকভাবে একটি enum কি, এবং এটি ব্যবহার করার সময় বুঝতে।

উদাহরণ স্বরূপ:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

সত্যিই কি এখানে ঘোষণা করা হচ্ছে?


Enum (গণনার সংক্ষিপ্তসার) মান একটি সেট (enumerators) সংখ্যার জন্য ব্যবহৃত হয়। একটি মান একটি বিমূর্ত জিনিস একটি প্রতীক দ্বারা প্রতিনিধিত্ব করা হয় (একটি শব্দ)। উদাহরণস্বরূপ একটি মৌলিক enum হতে পারে

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };

এই enum বেনামী বলা হয় কারণ আপনার নামটির একটি প্রতীক নেই। কিন্তু এটি এখনও পুরোপুরি সঠিক। শুধু এই মত ব্যবহার করুন

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;

ঠিক আছে. জীবন সুন্দর এবং সবকিছু ভাল যায়। কিন্তু একদিন আপনাকে আমার গ্র্যান্ডফাদারপ্যান্টসাইজ সংরক্ষণ করতে একটি নতুন পরিবর্তনশীল সংজ্ঞায়িত করতে এই এনমের পুনঃব্যবহার করতে হবে, তাহলে আপনি লিখবেন:

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;

কিন্তু তারপরে আপনার একটি কম্পাইলার ত্রুটি "সংখ্যার পুনর্বিবেচনা" আছে। প্রকৃতপক্ষে সমস্যাটি হল কম্পাইলার নিশ্চিত যে আপনি প্রথম enum এবং আপনার দ্বিতীয় একই জিনিস বর্ণনা।

তারপরে আপনি যদি কয়েকটি স্থানে এনক্যুটারেটরগুলির একই সেট (এখানে xs ... xxxxl) পুনঃব্যবহার করতে চান তবে আপনাকে এটি একটি অনন্য নামের সাথে ট্যাগ করতে হবে। আপনি এই সেট ব্যবহার দ্বিতীয় সময় আপনি শুধু ট্যাগ ব্যবহার করতে হবে। কিন্তু এই ট্যাগটি Enum শব্দটি প্রতিস্থাপিত করে না তবে কেবলমাত্র সংখ্যার সংখ্যার সেটটি ভুলবেন না। তারপর স্বাভাবিক হিসাবে enum ব্যবহার যত্ন নিন। এটার মত:

// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; 
// here the second use of my enum. It works now !
enum sizes myGrandFatherPantSize;

আপনি একটি পরামিতি সংজ্ঞা হিসাবে এটি ব্যবহার করতে পারেন:

// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;

আপনি যে সব জায়গায় enum পুনর্লিখন সুবিধাজনক বলতে পারে না এবং কোড বিট অদ্ভুত দেখায়। তুমি ঠিক. একটি বাস্তব টাইপ ভাল হবে।

এই সামিট আমাদের মহান অগ্রগতি চূড়ান্ত পদক্ষেপ। শুধু টাইপডফ যোগ করে আসুন আসল টাইপে আমাদের enum রূপান্তর করি। ওহ একটি শেষ জিনিস, টাইপডফ আপনার বর্গ মধ্যে অনুমতি দেওয়া হয় না। তারপর উপরে শুধু আপনার টাইপ সংজ্ঞায়িত। এটা এভাবে করো:

// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type

@interface myClass {
   ...
   size_type myGrandMotherDressSize, myGrandFatherPantSize;
   ...
}

ট্যাগ ঐচ্ছিক মনে রাখবেন। তারপরে এই ক্ষেত্রে যেহেতু, আমরা enumerators ট্যাগ কিন্তু একটি নতুন টাইপ সংজ্ঞায়িত করতে না। তারপর আমরা সত্যিই এটা আর প্রয়োজন হয় না।

// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;

@interface myClass : NSObject {
  ...
  size_type myGrandMotherDressSize, myGrandFatherPantSize;
  ...
}
@end

আপনি যদি এক্সকোডের সাথে অবজেক্টিভ-এ উন্নয়নশীল হন তবে আমি আপনাকে NS_ENUM এর সাথে প্রাকফিক্স করা কিছু চমৎকার ম্যাক্রো আবিষ্কার করতে দিই। যেটি আপনাকে ভাল enums সহজেই সংজ্ঞায়িত করতে সহায়তা করবে এবং স্ট্যাটিক বিশ্লেষককে কম্পাইল করার আগে আপনার জন্য কিছু আকর্ষণীয় চেক করতে সহায়তা করবে।

গুড ইনাম!


Enum উপাদান enum উপাদান নির্ধারণ করা হয় যা struct মধ্যে করা যাবে না। সুতরাং প্রতিবার পূর্ণ পরিবর্তনশীল অ্যাক্সেসের পরিবর্তে আমরা মান দ্বারা আমরা এটি enum এর ভেরিয়েবলগুলিতে বরাদ্দ করতে পারি। ডিফল্টরূপে এটি 0 অ্যাসাইনমেন্টের সাথে শুরু হয় তবে আমরা এটি কোনও মান নির্ধারণ করতে পারি এবং পরবর্তীতে ভেরিয়ালের ভেরিয়েবলটি একটি মান পূর্ববর্তী মান +1 করা হবে।


Typedef সি এবং সি ++ তে একটি কীওয়ার্ড। এটি বেসিক ডেটা প্রকারের জন্য নতুন নাম তৈরি করতে ব্যবহার করা হয় (গৃহস্থালি, int, float, double, struct এবং enum)

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

এখানে এটি সংখ্যাত ডেটা টাইপ শেপটাইপ তৈরি করে এবং এনাম টাইপ শেপ টাইপের জন্য আমরা নতুন নাম লিখতে পারি নিচে দেওয়া

ShapeType shape1; 
ShapeType shape2; 
ShapeType shape3;

enum অনেক ধরনের "ত্রুটি" কমাতে পারে এবং কোডটিকে আরো কার্যকর করতে পারে

#define STATE_GOOD 0
#define STATE_BAD 1
#define STATE_OTHER 2
int STATE = STATE_OTHER

সংজ্ঞা কোন সীমাবদ্ধতা আছে। এটা কেবল মাত্র একটি প্রতিস্থাপন। এটা রাষ্ট্রের সব শর্ত সীমাবদ্ধ করতে পারবেন না। যখন স্টেটটি 5 এ নির্ধারিত হয়, তখন প্রোগ্রামটি ভুল হবে, কারণ কোন মিলযুক্ত অবস্থা নেই। কিন্তু কম্পাইলার রাজ্য = 5 সতর্কবার্তা যাচ্ছে না

সুতরাং এটি ভালো ব্যবহার করা ভাল

typedef enum SampleState {
    SampleStateGood  = 0,
    SampleStateBad,
    SampleStateOther
} SampleState;

SampleState state = SampleStateGood;

আপনি নিচের বিন্যাসে ব্যবহার করতে পারেন, কাঁচা ডিফল্ট মান 0 থেকে শুরু করে, তাই

  • kCircle 0,
  • kRectangle 1,
  • KOblateSpheroid 2 হয়।

আপনি আপনার নিজস্ব নির্দিষ্ট মান মান নির্ধারণ করতে পারেন।

typedef enum : NSUInteger {
    kCircle, // for your value; kCircle = 5, ...
    kRectangle,
    kOblateSpheroid
} ShapeType;

ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0

একটি enum আদেশ মান একটি সেট ঘোষণা করে - typedef শুধু এই একটি সহজ নাম যোগ করে। প্রথম উপাদান 0 ইত্যাদি।

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

উপরে শুধুমাত্র আকৃতি টাইপ ট্যাগ একটি পরিমাপ।


একটি ব্যবহারকারী নির্ধারিত টাইপ যা kCircle , kRectangle , বা kOblateSpheroid সম্ভাব্য মানগুলি kOblateSpheroid । Enum (kCircle, ইত্যাদি) এর ভিতরে মানগুলি Enum এর বাইরে দৃশ্যমান। এটা মনে রাখা গুরুত্বপূর্ণ যে ( int i = kCircle; উদাহরণস্বরূপ, বৈধ)।


এখানে তিনটি বিষয় ঘোষণা করা হচ্ছে: একটি বেনামী সংখ্যার ধরন ঘোষণা করা হয়েছে, এই বেনামী গণনার জন্য ShapeType হিসাবে ঘোষণা করা হচ্ছে, এবং তিনটি নাম কে- kCircle , কে- kRectangle , এবং kOblateSpheroid অবিচ্ছেদ্য kOblateSpheroid হিসাবে ঘোষণা করা হচ্ছে।

চল নিচে যে বিরতি। সর্বাধিক ক্ষেত্রে, একটি গণনা হিসাবে ঘোষণা করা যেতে পারে

enum tagname { ... };

এটি ট্যাগ ট্যাগ tagname দিয়ে একটি পরিসংখ্যান ঘোষণা করে। সি এবং উদ্দেশ্য-সি (তবে সি ++ নয়), এর কোনও রেফারেন্স enum কীওয়ার্ডের সাথে আগেই থাকতে হবে। উদাহরণ স্বরূপ:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

সর্বত্র enum কীওয়ার্ড ব্যবহার করা এড়ানোর জন্য, একটি টাইপডফ তৈরি করা যেতে পারে:

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

এই এক লাইন মধ্যে সরলীকৃত করা যাবে:

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

এবং অবশেষে, যদি enum keyword দিয়ে enum tagname ব্যবহার করতে সক্ষম না হয়, আমরা enum বেনামী তৈরি করতে এবং শুধুমাত্র typedef নাম দিয়ে এটি ঘোষণা করতে পারি:

typedef enum { ... } tagname;

এখন, এই ক্ষেত্রে আমরা ShapeType টাইপকে একটি বেনামী গণনার একটি টাইপকৃত নাম হিসাবে ঘোষণা করছি। ShapeType সত্যিই একটি অবিচ্ছেদ্য প্রকার এবং কেবলমাত্র ভেরিয়েবলগুলি ঘোষণা করার জন্য ব্যবহার করা উচিত যা ঘোষণায় তালিকাভুক্ত মানগুলির মধ্যে একটি (যেটি কে- kCircle , কে- kRectangle এবং kOblateSpheroid ) kOblateSpheroid । আপনি ঢালাই দ্বারা একটি ShapeType পরিবর্তনশীল অন্য মান নির্ধারণ করতে পারেন, যদিও, তাই আপনি enum মান পড়া যখন সতর্কতা অবলম্বন করা আবশ্যক।

অবশেষে, kCircle , kRectangle , এবং kOblateSpheroid গ্লোবাল নামস্থানতে অবিচ্ছেদ্য kOblateSpheroid হিসাবে ঘোষণা করা হয়। যেহেতু কোনও নির্দিষ্ট মান উল্লেখ করা হয়নি তাই, তারা 0 দিয়ে শুরু হওয়া ক্রমাগত পূর্ণসংখ্যার জন্য নির্ধারিত হয়, তাই kCircle 0 হয়, kRectangle 1, এবং kOblateSpheroid 2 হয়।


64 বিট পরিবর্তন জন্য আপডেট: অ্যাপল ডক্স অনুযায়ী 64 বিট পরিবর্তন সম্পর্কে,

সংখ্যার এছাড়াও টাইপ করা হয়: এলএলভিএম কম্পাইলার, সংখ্যাযুক্ত গণিত গণনার আকার নির্ধারণ করতে পারেন। এর অর্থ হল কিছু সংখ্যক প্রকারের আকারের আকার আপনার চেয়ে বড় হতে পারে। সমাধান, অন্য সব ক্ষেত্রে যেমন, ডাটা টাইপের আকার সম্পর্কে কোন ধারণা তৈরি করা হয় না। পরিবর্তে, সঠিক ডাটা টাইপ সহ কোনও পরিবর্তনশীল মান নির্ধারণ করুন

64-বিট সমর্থন করার জন্য আপনাকে নীচের সিনট্যাক্স হিসাবে টাইপ দিয়ে enum তৈরি করতে হবে।

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

অথবা

typedef enum ShapeType : NSUInteger {
   kCircle,
   kRectangle,
   kOblateSpheroid
} ShapeType;

অন্যথা, এটি সতর্কতা অবলম্বন করবে কারণ Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType

দ্রুততর প্রোগ্রামিং জন্য আপডেট করুন:

দ্রুত, একটি সিনট্যাক্স পরিবর্তন আছে।

enum ControlButtonID: NSUInteger {
        case kCircle , kRectangle, kOblateSpheroid
    }

typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

তারপর আপনি এটি ব্যবহার করতে পারেন: -

 ShapeType shape;

এবং

 enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} 
ShapeType;

এখন আপনি এটি ব্যবহার করতে পারেন: -

enum ShapeType shape;






typedef