অবজেক্টিভ-সিতে ধ্রুবকগুলি


1002

আমি একটি কোকো অ্যাপ্লিকেশন বিকাশ করছি এবং আমি NSStringআমার পছন্দগুলির জন্য কী নাম সংরক্ষণ করার উপায় হিসাবে ধ্রুবক ব্যবহার করছি ।

আমি বুঝতে পারি এটি একটি ভাল ধারণা কারণ এটি প্রয়োজনে কীগুলি সহজেই পরিবর্তন করার অনুমতি দেয়।
এছাড়াও, এটি সম্পূর্ণ 'আপনার যুক্তি থেকে আপনার ডেটা পৃথক করুন' ধারণাটি নয়।

যাইহোক, পুরো প্রয়োগের জন্য একবার এই ধ্রুবকগুলি সংজ্ঞায়িত করার কোনও ভাল উপায় আছে কি?

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


7
গলি সম্পর্কে গোষ্ঠীবদ্ধ আপনার ডেটা সঙ্গে আপনার যুক্তি। আপনি যা প্রস্তাব করছেন তা হ'ল একটি ভাল প্রোগ্রামিং অনুশীলন, অর্থাত্ আপনার প্রোগ্রামটি পরিবর্তন করা সহজ।
রাফি খ্যাচাডৌড়িয়ান

উত্তর:


1287

আপনার মতো একটি শিরোনাম ফাইল তৈরি করা উচিত

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

( যদি আপনার কোড মিশ্র সি / সি ++ পরিবেশে বা অন্য প্ল্যাটফর্মে ব্যবহার না করা হয় তবে আপনি এর externপরিবর্তে ব্যবহার করতে পারেন FOUNDATION_EXPORT)

এই ফাইলটি প্রতিটি ফাইলের মধ্যে অন্তর্ভুক্ত করতে পারেন যা ধ্রুবকগুলি ব্যবহার করে বা প্রকল্পের জন্য প্রাক-সংকলিত শিরোনামে।

আপনি এই ধ্রুবকগুলি একটি। মি ফাইলের মতো সংজ্ঞায়িত করেন

// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

কনস্ট্যান্টস.এমটি আপনার অ্যাপ্লিকেশন / কাঠামোর লক্ষ্যে যুক্ত করা উচিত যাতে এটি চূড়ান্ত পণ্যের সাথে যুক্ত থাকে।

#define'ডি কনস্ট্যান্টের পরিবর্তে স্ট্রিং কনস্ট্যান্ট ব্যবহার করার সুবিধাটি হ'ল আপনি পয়েন্টার তুলনা ( stringInstance == MyFirstConstant) যা স্ট্রিং তুলনা ( [stringInstance isEqualToString:MyFirstConstant]) (এবং পড়তে সহজ, আইএমও) এর চেয়ে বেশি দ্রুত ব্যবহার করে সমতার জন্য পরীক্ষা করতে পারেন ।


67
একটি পূর্ণসংখ্যার ধ্রুবকটির জন্য এটি হবে: এক্সটার্নর ইনট কনট মাই ফার্স্টকনস্ট্যান্ট = 1;
ড্যান মরগান

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

74
এই ক্ষেত্রে, ধ্রুবকের সাথে সমতার জন্য পরীক্ষা করার জন্য == ব্যবহার করা ঠিক আছে, যদি এটি সত্যিকার অর্থে একটি ধ্রুবক প্রতীক হিসাবে ব্যবহার করা হয় (যেমন "" মাইফারস্টকন্সট্যান্ট "যুক্ত স্ট্রিংয়ের পরিবর্তে প্রতীক মাইফার্সস্ট্যান্ট ব্যবহৃত হয়)। এই ক্ষেত্রে স্ট্রিংয়ের পরিবর্তে একটি পূর্ণসংখ্যা ব্যবহার করা যেতে পারে (পয়েন্টারটিকে একটি পূর্ণসংখ্যার হিসাবে ব্যবহার করে - তবে আপনি যা করছেন) তবে ধ্রুবকের স্ট্রিংটি ব্যবহার করে ডিবাগিং কিছুটা সহজ হয়ে যায় কারণ ধ্রুবকের মানটি মানুষের পাঠযোগ্য অর্থ হয় ।
ব্যারি ওয়ার্ক

17
"কনস্ট্যান্টস.এম" এর জন্য +1 আপনার অ্যাপ্লিকেশন / কাঠামোর লক্ষ্যে যুক্ত করা উচিত যাতে এটি চূড়ান্ত পণ্যের সাথে সংযুক্ত থাকে। আমার বিচক্ষণতা বাঁচিয়েছে। @ এমোক, কনস্ট্যান্টস.এম-তে "তথ্য পান" করুন এবং "লক্ষ্য" ট্যাবটি চয়ন করুন। নিশ্চিত হয়ে নিন যে এটি প্রাসঙ্গিক লক্ষ্য (গুলি) জন্য পরীক্ষা করেছে।
PEZ

73
@ ব্যারি: কোকোয়, আমি বেশ কয়েকটি ক্লাস দেখেছি যা তাদের NSStringবৈশিষ্ট্যগুলির copyপরিবর্তে সংজ্ঞা দেয় retain। এই হিসাবে, তারা আপনার NSString*ধ্রুবকের একটি অন্য উদাহরণ ধরে রাখতে পারে (এবং হওয়া উচিত) এবং সরাসরি মেমরি ঠিকানার তুলনা ব্যর্থ হতে পারে। এছাড়াও, আমি ধরে নেব যে কোনও যুক্তিসঙ্গতভাবে যথাযথভাবে প্রয়োগ -isEqualToString:করা চরিত্রের তুলনার নীট-gদ্ধত্যের আগে পয়েন্টার সমতার জন্য পরীক্ষা করবে।
বেন মোশার

280

সহজ রাস্তা:

// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"

উত্তম উপায়:

// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";

দ্বিতীয়টির একটি সুবিধা হ'ল ধ্রুবকের মান পরিবর্তন করা আপনার পুরো প্রোগ্রামটির পুনর্নির্মাণের কারণ নয়।


12
আমি ভেবেছিলাম আপনার ধ্রুবকের মান পরিবর্তন করার কথা নয়।
রুপিচেকো

71
অ্যাপ্লিকেশন চলাকালীন নয়, কোডিংয়ের সময় অ্যান্ড্রু ধ্রুবকের মান পরিবর্তন করার কথা উল্লেখ করছেন।
র্যান্ডল

7
কাজটি extern NSString const * const MyConstantকরার অর্থের অর্থ কি কেবল একটি ধ্রুবক পয়েন্টারের চেয়ে ধ্রুবক বস্তুর কাছে ধ্রুবক পয়েন্টার হিসাবে যুক্ত করা যায়?
হরি করম সিং

4
কী ঘটবে, যদি আমি এই ঘোষণাপত্রটি হেডার ফাইলটিতে ব্যবহার করি তবে স্থিত এনএসএসস্ট্রিং * কনস্ট কেএনএসএসট্রিংকনস্ট = @ "কনস্ট মান"; .H এবং .m ফাইলগুলিতে পৃথকভাবে ঘোষণা না করা এবং আর ডি আর না করার মধ্যে পার্থক্য কী?
করিম

4
@ ডগওয়েদার - এমন এক জায়গায় যেখানে কেবল সংকলক উত্তরটি জানে। আইই, যদি আপনি কোনও মেনুতে অন্তর্ভুক্ত করতে চান যা কোনও অ্যাপ্লিকেশন তৈরির জন্য কোন সংকলক ব্যবহৃত হয়েছিল, আপনি সংকলিত কোডটি অন্যথায় জানার মতো না থাকায় আপনি এটি রাখতে পারেন। আমি অন্য অনেক জায়গার কথা ভাবতে পারি না। ম্যাক্রোগুলি অবশ্যই অনেক জায়গায় ব্যবহার করা উচিত নয়। আমার # ডেফাইন MY_CONST 5 এবং অন্য কোথাও # ডেফাইন MY_CONST_2 25 কী হবে ফলাফল 5 ধ্রুবকগুলির জন্য # ডেফাইন ব্যবহার করবেন না। ধ্রুবকগুলির জন্য কনস্ট ব্যবহার করুন।
আর্টঅফ ওয়ারফেয়ার

190

এখানে উল্লেখ করার মতো একটি বিষয়ও রয়েছে। আপনার যদি অ-বিশ্বব্যাপী ধ্রুবক প্রয়োজন হয় তবে আপনার staticকীওয়ার্ডটি ব্যবহার করা উচিত ।

উদাহরণ

// In your *.m file
static NSString * const kNSStringConst = @"const value";

staticমূলশব্দটির কারণে , এই কনস্টটি ফাইলের বাইরে দৃশ্যমান নয়।


@ কুইনটেলর দ্বারা মাইনর সংশোধন : স্থির ভেরিয়েবলগুলি একটি সংকলনের ইউনিটের মধ্যে দৃশ্যমান । সাধারণত, এটি একটি একক। মি ফাইল (যেমন এই উদাহরণ হিসাবে) তবে এটি আপনি কামড় দিতে পারেন যদি আপনি এটি অন্যত্র অন্তর্ভুক্ত থাকা শিরোনামে ঘোষণা করেন, যেহেতু সংকলনের পরে আপনি লিঙ্কারের ত্রুটি পাবেন it


41
গৌণ সংশোধন: স্থির ভেরিয়েবলগুলি একটি সংকলনের ইউনিটের মধ্যে দৃশ্যমান । সাধারণত, এটি একটি একক। মি ফাইল (যেমন এই উদাহরণ হিসাবে) তবে এটি আপনাকে কামড় দিতে পারে যদি আপনি এটি অন্যত্র অন্তর্ভুক্ত থাকা শিরোনামে ঘোষণা করেন, যেহেতু সংকলনের পরে আপনি লিঙ্কারের ত্রুটি পাবেন।
কুইন টেলর

আমি যদি স্থির কীওয়ার্ডটি ব্যবহার না করি, তবে কেএনএসএসআর্টিংকনস্ট পুরো প্রকল্প জুড়ে পাওয়া যাবে?
দানিয়াল আয়তেকিন

2
ঠিক আছে, ঠিক আছে যাচাই করা হয়েছে ... আপনি স্ট্যাটিক ছেড়ে দিলে এক্সকোড অন্য ফাইলগুলিতে এর জন্য স্বতঃপূরণ সরবরাহ করে না, তবে আমি একই নামটি দুটি পৃথক স্থানে রাখার চেষ্টা করেছি এবং কুইনের লিঙ্কারের ত্রুটিগুলি পুনরুত্পাদন করেছি।
দানিয়াল আয়তেকিন

1
একটি হেডার ফাইলে স্থিতিশীল লিঙ্কারের সমস্যা দেয় না। যাইহোক, শিরোনাম ফাইল সহ প্রতিটি সংকলন ইউনিট তার নিজস্ব স্ট্যাটিক ভেরিয়েবল পাবে, সুতরাং আপনি যদি 100 .m ফাইল থেকে শিরোনাম অন্তর্ভুক্ত করেন তবে আপনি তাদের 100 পাবেন get
gnasher729

@ কমপোজার .m ফাইলের কোন অংশে আপনি এটি স্থাপন করেন?
বেসিল বাউর্কে

117

গৃহীত (এবং সঠিক) উত্তরে বলা হয়েছে যে "আপনি এই [কনস্ট্যান্টস্] ফাইলটি এই প্রকল্পের প্রাক-সংকলিত শিরোনামে অন্তর্ভুক্ত করতে পারেন" "

নবাগত হিসাবে, আমাকে আরও ব্যাখ্যা ছাড়াই এটি করতে অসুবিধা হয়েছিল - এখানে কীভাবে হয়: আপনার অ্যাপ্লিকেশননেম হিয়ার-প্রিফিক্স.পিচ ফাইলে (এটি এক্সকোডের পূর্বনির্ধারিত শিরোনামের ডিফল্ট নাম), আপনার কনস্ট্যান্টসকে ব্লকের ভিতরে#ifdef __OBJC__ আমদানি করুন ।

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

এছাড়াও নোট করুন যে কনস্ট্যান্টস.আর এবং কনস্ট্যান্টস.এম ফাইলগুলিতে গ্রহণযোগ্য উত্তরে বর্ণিত ব্যতীত এগুলিতে অন্য কোনও কিছুই থাকা উচিত নয়। (কোনও ইন্টারফেস বা বাস্তবায়ন নেই)।


আমি এটি করেছি তবে কিছু ফাইল সঙ্কলন করতে ত্রুটি ছুঁড়েছে "অঘোষিত শনাক্তকারী 'কনস্ট্যান্টস ব্যবহারকারীর নাম' ব্যবহার করা যদি আমি ত্রুটি ছুঁড়ে ফেলার ধ্রুবক ফাইলটিতে ধ্রুবককে অন্তর্ভুক্ত করি তবে এটি কাজ করে, তবে এটি আমি করতে চাই না I আমি পরিষ্কার করেছি, শাটডাউন করছি এক্সকোড এবং বিল্ড এবং এখনও সমস্যা ... কোনও ধারণা?
J3RM

50

ব্যারি ওয়ার্ক এবং রাহুল গুপ্তের পোস্ট করা উপায়টি আমি সাধারণত ব্যবহার করি।

যদিও, আমি .h এবং .m ফাইল উভয় ক্ষেত্রে একই শব্দগুলি পুনরাবৃত্তি করতে পছন্দ করি না। দ্রষ্টব্য, নিম্নলিখিত উদাহরণে উভয় ফাইলে লাইনটি প্রায় অভিন্ন:

// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";

অতএব, আমি যা করতে চাই তা হ'ল কিছু সি প্রিপ্রসেসর যন্ত্রপাতি ব্যবহার করা। আমি উদাহরণের মাধ্যমে ব্যাখ্যা করি।

আমার কাছে একটি শিরোলেখ ফাইল রয়েছে যা ম্যাক্রো সংজ্ঞায়িত করে STR_CONST(name, value):

// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif

আমার। এইচ / .এম জুটির মধ্যে যেখানে আমি ধ্রুবকটি সংজ্ঞায়িত করতে চাই আমি নিম্নলিখিতগুলি করি:

// myfile.h
#import <StringConsts.h>

STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"

এবং ভয়েলা, আমার কাছে কেবলমাত্র .h ফাইলে ধ্রুবকগুলির সমস্ত তথ্য আছে।


হুম, কিছুটা সতর্কতা আছে তবে আপনি এই কৌশলটি ব্যবহার করতে পারবেন না যদি শিরোলেখ ফাইলটি পূর্বনির্ধারিত শিরোনামে আমদানি করা হয়, কারণ এটি .m ফাইলটিতে .h ফাইলটি লোড করবে না কারণ এটি ইতিমধ্যে সংকলিত ছিল। যদিও একটি উপায় আছে - আমার উত্তর দেখুন (যেহেতু আমি মন্তব্যগুলিতে ভাল কোড রাখতে পারি না
স্কট লিটল

আমি এই কাজ পেতে পারি না। যদি আমি # মাইফাইল "মাইফাইল এইচ" এর আগে # সংজ্ঞায়িত সিঙ্কথিজিজেডকন্টসটিস রাখি তবে এটি .h এবং .m উভয় ক্ষেত্রে এনএসএসটিং * করে ... (সহকারী ভিউ এবং প্রিপ্রসেসর ব্যবহার করে পরীক্ষা করা হয়েছে)। এটি পুনরায় সংজ্ঞা ত্রুটি ছুড়ে দেয়। যদি আমি এটি # মিম্পোর্ট "মাইফাইল এইচ" পরে রাখি তবে এটি উভয় ফাইলে এক্সটার্নাল এনএসএসস্ট্রিং * ... করে। তারপরে এটি "অপরিবর্তিত প্রতীক" ত্রুটি ছুড়ে দেয়।
আর্সেনিয়াস

28

আমার নিজের মতো এমন পছন্দগুলির জন্য ব্যবহৃত ধ্রুবক এনএসএসআরটিংগুলি ঘোষণার জন্য উত্সর্গীকৃত একটি শিরোনাম রয়েছে:

extern NSString * const PPRememberMusicList;
extern NSString * const PPLoadMusicAtListLoad;
extern NSString * const PPAfterPlayingMusic;
extern NSString * const PPGotoStartupAfterPlaying;

তারপরে তাদের সাথে থাকা মি। ফাইলগুলিতে ঘোষণা করুন:

NSString * const PPRememberMusicList = @"Remember Music List";
NSString * const PPLoadMusicAtListLoad = @"Load music when loading list";
NSString * const PPAfterPlayingMusic = @"After playing music";
NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing";

এই পদ্ধতির আমার ভাল সেবা করেছে।

সম্পাদনা: নোট করুন যে স্ট্রিংগুলি একাধিক ফাইলে ব্যবহার করা হলে এটি সবচেয়ে ভাল কাজ করে। যদি কেবল একটি ফাইল এটি ব্যবহার করে তবে আপনি কেবল #define kNSStringConstant @"Constant NSString"স্ট্রিং ব্যবহার করে .m ফাইলটিতে করতে পারেন ।


25

@ ক্রিজের পরামর্শের সামান্য পরিবর্তন, যাতে কনস্ট্যান্টস শিরোনাম ফাইলটি পিএইচচে অন্তর্ভুক্ত করতে হয় তবে এটি সঠিকভাবে কাজ করে, যা স্বাভাবিক rather যেহেতু মূলটি পিএইচসি-তে আমদানি করা হয়েছে তাই এটি এটিকে .mফাইলে পুনরায় লোড করবে না এবং এর ফলে আপনি কোনও চিহ্ন পাবেন না এবং লিঙ্কারটি অসন্তুষ্ট।

যাইহোক, নিম্নলিখিত পরিবর্তন এটি কাজ করতে দেয়। এটি কিছুটা সংশ্লেষিত, তবে এটি কার্যকর।

আপনি প্রয়োজন হবে 3 ফাইল, .hফাইল যা ধ্রুবক সংজ্ঞা, হয়েছে .hফাইল এবং .mফাইল, আমি ব্যবহার করব ConstantList.h, Constants.hএবং Constants.mযথাক্রমে। বিষয়বস্তু Constants.hসহজভাবে হয়:

// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"

এবং Constants.mফাইলটি দেখে মনে হচ্ছে:

// Constants.m
#ifdef STR_CONST
    #undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"

পরিশেষে, ConstantList.hফাইলটির আসল ঘোষণা রয়েছে এবং এটি হ'ল:

// ConstantList.h
STR_CONST(kMyConstant, "Value");

কয়েকটি বিষয় লক্ষণীয়:

  1. ম্যাক্রোটি ব্যবহারের জন্য এটি .mফাইল করার পরে ফাইলটিতে #undefম্যাক্রোর নতুন সংজ্ঞা দিতে হয়েছিল।

  2. আমাকে সঠিকভাবে কাজ করার জন্য এর #includeপরিবর্তে ব্যবহার #importকরতে হয়েছিল এবং পূর্ববর্তী পূর্বনির্ধারিত মানগুলি দেখে সংকলকটি এড়াতে হয়েছিল।

  3. এটির জন্য আপনার পিএইচসি (এবং সম্ভবত পুরো প্রকল্প) এর পুনরায় সংকলন প্রয়োজন যখনই কোনও মান পরিবর্তন করা হয়, যা এগুলি স্বাভাবিক হিসাবে আলাদা (এবং সদৃশ) করা হয় তা নয়।

আশা করি এটি কারও জন্য সহায়ক।


1
# অন্তর্ভুক্ত ব্যবহারটি আমার জন্য এই মাথা ব্যাথা স্থির করে।
রমসেল

গৃহীত উত্তরের সাথে তুলনা করলে এর কোনও কর্মক্ষমতা / স্মৃতিশক্তি হারাতে পারে?
গাইফিস

গ্রহণযোগ্য উত্তরের তুলনায় পারফরম্যান্সের উত্তরে, কোনওটিই নেই। কম্পাইলারের দৃষ্টিকোণ থেকে এটি কার্যকরভাবে একই জিনিস। আপনি একই ঘোষণা দিয়ে শেষ। আপনি উপরেরটি প্রতিস্থাপন করে যদি তারা ঠিক একই রকম externহন FOUNDATION_EXPORT
স্কট লিটল


12

আবাইজার যেমন বলেছিলেন, আপনি এটি পিএইচসি ফাইলের মধ্যে রাখতে পারেন। অন্যটি উপায় যা এতটা নোংরা নয় তা হ'ল আপনার সমস্ত কীগুলির জন্য একটি অন্তর্ভুক্ত ফাইল তৈরি করা এবং তারপরে যে ফাইলটি আপনি কীগুলিতে ব্যবহার করছেন সেটিতে এটি অন্তর্ভুক্ত করুন, বা এটি পিএইচসি-তে অন্তর্ভুক্ত করুন। তাদের নিজস্ব ফাইল অন্তর্ভুক্ত করুন, যা কমপক্ষে আপনাকে এই ধ্রুবকগুলির সন্ধান এবং সংজ্ঞা দেওয়ার জন্য একটি জায়গা দেয়।


11

আপনি যদি বিশ্বব্যাপী ধ্রুবকের মতো কিছু চান; একটি দ্রুত নোংরা উপায় হ'ল ধ্রুবক ঘোষণাগুলি pchফাইলে রাখা।


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

8

একটি শ্রেণিবদ্ধ পদ্ধতি ব্যবহার করে দেখুন:

+(NSString*)theMainTitle
{
    return @"Hello World";
}

আমি মাঝে মাঝে এটি ব্যবহার করি।


6
একটি শ্রেণি পদ্ধতি একটি ধ্রুবক হয় না। চলার সময় এটির ব্যয় হয় এবং সর্বদা একই জিনিসটি ফিরে না আসতে পারে (এটি যদি আপনি সেভাবে এটি বাস্তবায়ন করেন তবে আপনি অবশ্যই সেভাবে এটি প্রয়োগ করেননি), যার অর্থ আপনাকে isEqualToString:তুলনার জন্য ব্যবহার করতে হবে , যা রান সময় একটি আরও ব্যয়। আপনি যখন ধ্রুবক চান, তখন ধ্রুবক তৈরি করুন।
পিটার হোসি

2
@ পিটার হোসি, যদিও আপনার মন্তব্যগুলি সঠিক, আমরা এটির জন্য কোনও উদ্বেগ ছাড়াই রুবির মতো "উচ্চ-স্তরের" ভাষায় এলওসি বা একবারের চেয়ে আরও একবারে পারফরম্যান্সটি গ্রহণ করি। আমি বলছি না আপনি ঠিক নন, বরং কেবল ভিন্ন ভিন্ন "বিশ্বজগতে" কীভাবে মানগুলি আলাদা সে সম্পর্কে মন্তব্য করছি।
ড্যান রোজনস্টার্ক

1
রুবির উপর সত্য। লোকেরা যে পারফরম্যান্সের কোড দেয় তার বেশিরভাগই টিপিকাল অ্যাপের জন্য বেশ অপ্রয়োজনীয়।
পিটার ডিউইউজ 21

8

আপনি যদি নেমস্পেসের ধ্রুবকটি পছন্দ করেন তবে আপনি শুক্রবারের প্রশ্নোত্তর কাঠামোটি অর্জন করতে পারেন 2011-08-19: নেমস্পিড কনস্ট্যান্টস এবং ফাংশনগুলি

// in the header
extern const struct MANotifyingArrayNotificationsStruct
{
    NSString *didAddObject;
    NSString *didChangeObject;
    NSString *didRemoveObject;
} MANotifyingArrayNotifications;

// in the implementation
const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = {
    .didAddObject = @"didAddObject",
    .didChangeObject = @"didChangeObject",
    .didRemoveObject = @"didRemoveObject"
};

1
দুর্দান্ত জিনিস! তবে এআরসি এর অধীনে আপনার __unsafe_unretainedএটির কাজ করার জন্য কাঠামো ঘোষণার সমস্ত ভেরিয়েবলের উপসর্গ করতে হবে ।
সেমেন

7

আমি একটি সিঙ্গলটন ক্লাস ব্যবহার করি, যাতে আমি ক্লাসটিকে উপহাস করতে পারি এবং পরীক্ষার জন্য প্রয়োজনে ধ্রুবকগুলি পরিবর্তন করতে পারি। ধ্রুবক শ্রেণিটি এর মতো দেখাচ্ছে:

#import <Foundation/Foundation.h>

@interface iCode_Framework : NSObject

@property (readonly, nonatomic) unsigned int iBufCapacity;
@property (readonly, nonatomic) unsigned int iPort;
@property (readonly, nonatomic) NSString * urlStr;

@end

#import "iCode_Framework.h"

static iCode_Framework * instance;

@implementation iCode_Framework

@dynamic iBufCapacity;
@dynamic iPort;
@dynamic urlStr;

- (unsigned int)iBufCapacity
{
    return 1024u;
};

- (unsigned int)iPort
{
    return 1978u;
};

- (NSString *)urlStr
{
    return @"localhost";
};

+ (void)initialize
{
    if (!instance) {
        instance = [[super allocWithZone:NULL] init];
    }
}

+ (id)allocWithZone:(NSZone * const)notUsed
{
    return instance;
}

@end

এবং এটি এর মতো ব্যবহৃত হয় (ধ্রুবকগুলির জন্য শর্টহ্যান্ডের ব্যবহারটি নোট করুন - এটি [[Constants alloc] init]প্রতিবার টাইপ করে সংরক্ষণ করে):

#import "iCode_FrameworkTests.h"
#import "iCode_Framework.h"

static iCode_Framework * c; // Shorthand

@implementation iCode_FrameworkTests

+ (void)initialize
{
    c  = [[iCode_Framework alloc] init]; // Used like normal class; easy to mock!
}

- (void)testSingleton
{
    STAssertNotNil(c, nil);
    STAssertEqualObjects(c, [iCode_Framework alloc], nil);
    STAssertEquals(c.iBufCapacity, 1024u, nil);
}

@end

1

আপনি যদি NSString.newLine;উদ্দেশ্য সি থেকে এই জাতীয় কিছু কল করতে চান এবং আপনি এটি স্থির ধ্রুবক হতে চান তবে আপনি দ্রুত এ জাতীয় কিছু তৈরি করতে পারেন:

public extension NSString {
    @objc public static let newLine = "\n"
}

এবং আপনার কাছে দুর্দান্ত পাঠযোগ্য ধ্রুবক সংজ্ঞা রয়েছে এবং প্রকারের প্রসঙ্গে আবদ্ধ থাকা অবস্থায় আপনার পছন্দের কোনও ধরণের মধ্যে এটি উপলব্ধ।

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