আমি কীভাবে NSMutableArray কে NSArray এ রূপান্তর করব উদ্দেশ্য গ?
NSArray *array = mutableArray;
আমি কীভাবে NSMutableArray কে NSArray এ রূপান্তর করব উদ্দেশ্য গ?
NSArray *array = mutableArray;
উত্তর:
NSArray *array = [mutableArray copy];
Copy
অপরিবর্তনীয় অনুলিপি তৈরি করে। এটি বেশ কার্যকর কারণ অ্যাপল বিভিন্ন অপ্টিমাইজেশন করতে পারে। উদাহরণস্বরূপ, copy
অপরিবর্তনযোগ্য অ্যারে প্রেরণ কেবলমাত্র বস্তুকে ধরে রাখে এবং ফেরত দেয় self
।
আপনি যদি আবর্জনা সংগ্রহ বা এআরসি ব্যবহার না করেন তবে মনে রাখবেন যে -copy
বিষয়টিটি ধরে রাখে।
copy
একটি সাধারণ এনএসআরে তৈরি করে এবং এনএসমিটেবলআরে তৈরি করে না?
NSArray
& NSMutableArray
, NSString
& NSMutableString
। তবে উদাহরণস্বরূপ নয় NSViewController
যা সর্বদা পরিবর্তনীয় স্থিতি ধারণ করে।
একটি NSMutableArray
একটি উপশ্রেণী হয় NSArray
তাই আপনি সবসময় রূপান্তর কিন্তু করার প্রয়োজন হবে না আপনি কি নিশ্চিতরূপে অ্যারের পরিবর্তন করা যায় না যে আপনি একটি তৈরি করতে পারেন করতে চান তাহলে NSArray
আপনি চান কিনা তা autoreleased বা না তার উপর নির্ভর করে এই উপায়ে করুন:
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
সম্পাদনা করুন: সমাধান গেয়র্গ Schölly দ্বারা উপলব্ধ এটি এবং অনেক ক্লিনার করছেন একটি ভাল উপায় বিশেষত এখন যে আমরা এআরসি আছে এবং এমনকি autorelease কল করতে হবে না হয়।
আমি দুটি প্রধান সমাধান দুটিই পছন্দ করি:
NSArray *array = [NSArray arrayWithArray:mutableArray];
অথবা
NSArray *array = [mutableArray copy];
আমি তাদের মধ্যে যে প্রাথমিক পার্থক্যটি দেখতে পাচ্ছি তা হ'ল মিউটিয়েটেবল অ্যারে যখন হয় তখন তারা কীভাবে আচরণ করে :
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
[mutableArray copy]
সরলীকৃত করা যেতে পারে [nil copy]
। উদ্দেশ্য- সিতে নীলকে পাঠানো কোনও বার্তা সর্বদা শূন্য থাকবে। "কিছুই না" এবং "এতে কিছু নেই এমন অ্যারে" এর মধ্যে পার্থক্যটি মনে রাখা গুরুত্বপূর্ণ important
আপনি এই কোড চেষ্টা করে ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
এবং
NSArray *myArray = [myMutableArray copy];
নীচে NSMutableArray কে এনএসআরে রূপান্তর করার উপায় রয়েছে:
//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];
//Make copy of array
NSArray *newArray2 = [oldArray copy];
//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];
//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;
সুইফট ৩.০ এ নতুন ডেটা টাইপ অ্যারে রয়েছে । ঘোষণা এরে ব্যবহার let
শব্দ তারপর এটি হয়ে যাবে NSArray ঘোষণা ব্যবহার করা হয় তবে var
তাহলে এটি হয়ে শব্দ NSMutableArray ।
কোডের উদাহরণ:
let newArray = oldArray as Array
Array
NSArray
NSMutableArray
উদ্দেশ্য-গ:
NSArray *myArray = [myMutableArray copy];
দ্রুত:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
এই [mutableArray copy]
অ্যান্টিপ্যাটার্ন সমস্ত নমুনা কোড জুড়ে। ক্ষণস্থায়ী এবং ছড়িয়ে পড়া পরিবর্তনের জন্য বর্তমান সুযোগের শেষে বিচ্ছিন্ন হয়ে যাওয়ার জন্য এগুলি বন্ধ করুন।
রানটাইম কোনও পরিবর্তনযোগ্য অ্যারের অপ্রয়োজনীয় অনুলিপিটিকে অপ্টিমাইজ করতে পারে এমন কোনও উপায় নেই যা কেবল সুযোগের বাইরে চলে যায়, 0 এ কমে যায় এবং ভালোর জন্য বিযুক্ত হয়।
NSMutableArray
একটি থেকে NSArray
পরিবর্তনশীল ব্যাপারটা গোপন রাখা হবে না (যা কি ওপি প্রশ্ন সম্পর্কে)। যদি এই মানটি অপ্রত্যাশিতভাবে পরিবর্তিত হয় তবে এই জাতীয় মান (উদাহরণস্বরূপ রিটার্ন মান বা সম্পত্তি হিসাবে) প্রকাশ করা সমস্যার ডিবাগ করতে খুব শক্ত হতে পারে। পরিবর্তনীয় মানটি ভাগ করা হওয়ায় এটি অভ্যন্তরীণ এবং বাহ্যিক মিউটেশন উভয়ের ক্ষেত্রেই প্রযোজ্য।
NSMutableArray
ভেরিয়েবলকে বরাদ্দ করা যথেষ্ট is যেহেতু বস্তুটি কখনই পরিবর্তনযোগ্য অ্যারে হওয়া বন্ধ করে দেয় না, এতে পরিবর্তনের পদ্ধতিগুলি কল করা সফল হবে এবং ভাগ করা ডেটা পরিবর্তন করবে। অন্যদিকে যদি মূল পরিবর্তনীয় অ্যারেটি অনুলিপি করা হয় - এটি পরিবর্তনযোগ্য অ্যারেতে পরিবর্তন করা হয় — এবং তারপরে কোনও NSMutableArray
ভেরিয়েবলের জন্য বরাদ্দ করা হয় এবং পরিবর্তিত পদ্ধতিগুলি কল করা হয়, তবে সেই কলগুলি doesNotRespondToSelector
ত্রুটিগুলি সহ ব্যর্থ হয় কারণ যে রূপটি পরিবর্তনের পদ্ধতি কলটি পেয়েছিল সেটিতে রয়েছে বাস্তব পরিবর্তনযোগ্য এবং এই পদ্ধতিগুলিতে সাড়া দেয় না।
যদি আপনি মিউটেবিলিটির মাধ্যমে একটি অ্যারে তৈরি করে থাকেন এবং তারপরে কোনও পরিবর্তনযোগ্য সংস্করণটি ফিরে পেতে চান তবে আপনি উত্তরাধিকারের মাধ্যমে কেবল "এনএসএররে" হিসাবে পরিবর্তনীয় অ্যারেটি ফিরিয়ে দিতে পারেন।
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
যদি কলকারীকে (প্রযুক্তিগতভাবে এখনও পরিবর্তনযোগ্য) রিটার্ন অবজেক্টটিকে অপরিবর্তনীয় এনএসআরাই হিসাবে গণ্য করার জন্য আপনি "বিশ্বাস" করেন তবে এটি তার চেয়ে সস্তা বিকল্প [mutableArray copy]
।
এটি কোনও প্রাপ্ত বস্তুকে পরিবর্তন করতে পারে কিনা তা নির্ধারণ করার জন্য, কোনও বার্তা গ্রহণকারীকে অবশ্যই ফেরতের মূল্যের আনুষ্ঠানিক ধরণের উপর নির্ভর করতে হবে। যদি এটি গ্রহণ করে, উদাহরণস্বরূপ, কোনও অ্যারে অবজেক্ট হিসাবে টাইপ করা বস্তুটি এটির পরিবর্তিত করার চেষ্টা করা উচিত নয় । কোনও শ্রেণীর সদস্যতার ভিত্তিতে কোনও বস্তু পরিবর্তনযোগ্য কিনা তা নির্ধারণ করা কোনও গ্রহণযোগ্য প্রোগ্রামিং অনুশীলন নয়।
উপরোক্ত অনুশীলনটি এখানে আরও বিশদে আলোচনা করা হয়েছে:
সেরা অনুশীলন: রিটার্নের ধরণ যদি এনএসআর্রে হয় তবে রিটার্ন মিউটেটেবলআরআর.কপি বা মিউটেবলআররে করুন
আমি দ্রুত 3 এ উত্তরটি অনুসন্ধান করছিলাম এবং এই প্রশ্নটি অনুসন্ধানের প্রথম ফলাফল হিসাবে প্রদর্শিত হয়েছিল এবং আমি উত্তরটি থেকে অনুপ্রেরণা পেয়েছি তাই এখানে সুইফট 3 কোডটি রয়েছে
let array: [String] = nsMutableArrayObject.copy() as! [String]
NSArray *array = [mutableArray copy];