আমি ওজেক্টিভ-সি-তে কীভাবে একটি ENUM সংজ্ঞায়িত এবং ব্যবহার করব?


180

আমি নীচে প্রদর্শিত হবে হিসাবে আমার বাস্তবায়ন ফাইল একটি এনাম ঘোষণা, এবং আমার ইন্টারফেসে প্লেয়ারস্টেট thePlayerState হিসাবে এই ধরণের একটি পরিবর্তনশীল ঘোষণা; এবং আমার পদ্ধতিতে ভেরিয়েবল ব্যবহার করেছেন। তবে আমি এটি অঘোষিত বলে উল্লেখ করে ত্রুটি পাচ্ছি। আমি কীভাবে সঠিকভাবে আমার পদ্ধতিগুলিতে প্লেয়ারস্টেট টাইপের একটি পরিবর্তনশীল ডিক্লেয়ার করব এবং ব্যবহার করব ?:

.M ফাইল এ

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

.h ফাইলটিতে:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

.m ফাইলের কিছু পদ্ধতিতে:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

2
এনামের ধরণটি হ'ল প্লেয়ারস্টেট। প্লেয়ারস্টেটটাইপস কী হয়ে যায়?
user4951

3
NS_ENUM এবং এর সর্বশেষ আধুনিক সিনট্যাক্স সম্পর্কে তথ্যের জন্য, ম্যাট থম্পসন দ্বারা পোস্ট করা NS_ENUM এবং NS_OPTIONS দেখুন
বাসিল বাউরক

উত্তর:


109

আপনার typedefশিরোনাম ফাইলে থাকতে হবে (বা অন্য কোনও ফাইল যা #importআপনার শিরোনামে রুপান্তরিত হয়েছে), কারণ অন্যথায় PlayerStateসংকলকটি ivar বানাতে কোন আকারটি জানবে না । তা ছাড়া আমার কাছে এটি ঠিক আছে।


এটিকে একটি পৃথক ফাইলে রাখার বিকল্পটি আমার ক্ষেত্রে ঠিক মনে হয়েছিল। আমি জানি না এটি একটি ভাল পদ্ধতির কিনা তবে আমার দুটি ভিন্ন ভিউকন্ট্রোলার (স্ব এবং এটির প্রতিনিধি / ডেটাসোর্স) এ একই এনাম ব্যবহার করা দরকার। প্রতিনিধি / ডেটাসোর্সটির শিরোনাম আমদানি করার ফলে একটি ত্রুটি ঘটেছে এবং সাধারণ প্রয়োজনের জন্য খুব বেশি মনে হয়। সুতরাং আমি এনামের সাথে একটি নতুন .h ফাইল তৈরি করে এটিকে উভয় ভিউকন্ট্রোলার্স ফাইলটিতে আমদানি করেছি। কবজির মতো কাজ করেছেন।
লেয়ানড্রো আলভেস

7
NS_ENUM ম্যাক্রো ব্যবহার করার পরামর্শ দেওয়া উচিত - যেহেতু এটি সর্বোত্তম অনুশীলন
খেব্বি

1
আপনি NS_ENUMযদি এনামটি সুইফট কোডে উপলব্ধ করতে চান তবে আপনাকে অবশ্যই অবজেক্টিভ-সি ব্যবহার করে এনামগুলি ঘোষণা করতে হবে।
স্মাইলিবার্গ

@ ডেভিডলং, এটি কি 2015 সালে এখনও কার্যকর? আমার কাছে ফাইলটিতে typedefঘোষিত আছে .mএবং এটি সংকলন করে ভালভাবে চলে।
আইলিয়ান ওনোফ্রেই

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

206

অ্যাপল সুইফট সহ আরও ভাল কোডের সামঞ্জস্যতা সরবরাহ করতে সহায়তা করার জন্য একটি ম্যাক্রো সরবরাহ করে। ম্যাক্রো ব্যবহার করে দেখতে এটি দেখতে ভাল লাগে।

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

এখানে ডকুমেন্টেড


ওবজ সি এনামসের জাভা-র মতো সদস্যের ভেরিয়েবল থাকতে পারে? যদি তাই হয়, কিভাবে?
ক্লকস্মিত

তাহলে দ্বিতীয় সমাধানটি আরও ভাল?
Iulian Onofrei

3
দ্বিতীয় সমাধানটি আরও ভাল (ব্যবহার করা NS_ENUM) হ'ল এটি আরও আধুনিক এবং আপনি যদি এনামটি সুইফট কোডে উপলভ্য করতে চান তবে এখন অবজেক্টিভ-সিতে প্রয়োজনীয়।
স্মাইলিবার্গ

দ্বিতীয় সমাধানটি আপডেট করার জন্য আপডেট করা আসলে আরও ভাল।
বিবিলেজাচ

অ্যাপলের স্ট্যান্ডার্ড ফর্মে, প্রতিটি এনাম মানের জন্য টাইপের নামটি পুনরাবৃত্তি হয়।
টমাসডব

29

.হ:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
আপনি অন্যান্য এসও প্রশ্নে এর মতো উত্তর পেতে পারেন তবে আমি যখন এনামগুলিকে পর্যালোচনা করছিলাম তখন এই প্রশ্নটি প্রথমে পপ আপ হয়েছিল, তাই আমি এখানে উত্তরও যুক্ত করেছি।
বেন ফ্লিন 20

19

বর্তমান প্রকল্পগুলির সাথে আপনি NS_ENUM()বা NS_OPTIONS()ম্যাক্রোগুলি ব্যবহার করতে চাইতে পারেন ।

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

2
... এবং আরও গুরুত্বপূর্ণ, এখন আপনি NS_ENUMযদি আপনার এনাম সুইফট কোডে উপলব্ধ থাকতে চান তবে আপনাকে অবশ্যই উদ্দেশ্যমূলক-সি ব্যবহার করে এনামগুলি ঘোষণা করতে হবে ।
স্মাইলিবার্গ

16

এনএসএসস্ট্রিংয়ের মতো ক্লাসগুলির জন্য অ্যাপল এটির মতো করে:

শিরোলেখ ফাইলটিতে:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Http://developer.apple.com/ এ কোডিং গাইডলাইনস দেখুন


3
এটি আসলে ওপিকে সহায়তা করে না। প্রযুক্তিগতভাবে সঠিক হলেও এটি পুনরায় ব্যবহারযোগ্য
এনাম

24
বিকাশকারী.অ্যাপল ডট কমের সাথে লিঙ্ক করা সত্যিকারের সহায়ক নয়। পরিবর্তে অন্য কোনও স্থানের উদ্ধৃতি দিতে চান?
ব্রেট

ইতোমধ্যে প্রদত্ত ডকুমেন্টেশন অনুলিপি / আটকান, মূল পাতাটি লিঙ্কটি অন্য ব্যক্তিকে সত্যই সহায়তা করছে না ...
ওণ্ডার ওজকান


8

আমি NS_OPTIONS বা NS_ENUM ব্যবহার করার পরামর্শ দিচ্ছি। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: http://nshipster.com/ns_enum-ns_options/

এখানে এনএস_অপশন ব্যবহার করে আমার নিজস্ব কোডের একটি উদাহরণ রয়েছে, আমার একটি ইউটিলিটি রয়েছে যা একটি ইউআইভিউর স্তরে একটি সাবলেয়ার (ক্যালায়ার) সেট করে যাতে একটি সীমানা তৈরি হয়।

এইচ। ফাইল:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

.M ফাইল:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

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