আমি কীভাবে NSMutableArray কে NSArray এ রূপান্তর করব?


381

আমি কীভাবে NSMutableArray কে NSArray এ রূপান্তর করব ?


12
justNSArray *array = [mutableArray copy];
বেরিলিয়াম

1
NSArray *array = mutableArray;
vladof81

4
বেরিলিয়াম: একেবারে ঠিক। vladof81: অবশ্যই না।
gnasher729

উত্তর:


511
NSArray *array = [mutableArray copy];

Copyঅপরিবর্তনীয় অনুলিপি তৈরি করে। এটি বেশ কার্যকর কারণ অ্যাপল বিভিন্ন অপ্টিমাইজেশন করতে পারে। উদাহরণস্বরূপ, copyঅপরিবর্তনযোগ্য অ্যারে প্রেরণ কেবলমাত্র বস্তুকে ধরে রাখে এবং ফেরত দেয় self

আপনি যদি আবর্জনা সংগ্রহ বা এআরসি ব্যবহার না করেন তবে মনে রাখবেন যে -copyবিষয়টিটি ধরে রাখে।


2
এই উত্তরটি দুর্দান্ত, তবে আমি কীভাবে ডক্সগুলি থেকে বলতে পারি যেগুলি copyএকটি সাধারণ এনএসআরে তৈরি করে এবং এনএসমিটেবলআরে তৈরি করে না?
ড্যান রোজনস্টার্ক

22
@Yar: আপনি তাকান ডকুমেন্টেশন NSCopying কিন্তু সেখানে বলে: copyWithZone দ্য ফিরে কপি অপরিবর্তনীয় বিবেচনা "অপরিবর্তনীয় বনাম চপল" প্রাপ্তির বস্তুর ক্ষেত্রে প্রযোজ্য যদি হয়; অন্যথায় অনুলিপিটির সঠিক প্রকৃতি ক্লাস দ্বারা নির্ধারিত হয়।
জর্জি স্কলি

1
খুব ঝরঝরে - আমি এম 5 এইচ এর সমাধানের চেয়ে এটি পছন্দ করি। উভয় পরিশ্রমে এবং আরও কার্যকর।
ডেভিড স্নাবেল-কাউন্ট

1
আমি ডেভিডকে সম্মত করছি, এই প্রতিক্রিয়াটির প্রতি নির্দেশ করতে আমার প্রতিক্রিয়া আপডেট করেছি।
হলস্কি

2
@ ব্র্যাড: এর অর্থ এমন ক্লাসগুলির অর্থ যা পারস্পরিক পরিবর্তন এবং অপরিবর্তনীয় উভয় বাস্তবায়ন রয়েছে। যেমন NSArray& NSMutableArray, NSString& NSMutableString। তবে উদাহরণস্বরূপ নয় NSViewControllerযা সর্বদা পরিবর্তনীয় স্থিতি ধারণ করে।
জর্জি স্কলি

361

একটি NSMutableArrayএকটি উপশ্রেণী হয় NSArrayতাই আপনি সবসময় রূপান্তর কিন্তু করার প্রয়োজন হবে না আপনি কি নিশ্চিতরূপে অ্যারের পরিবর্তন করা যায় না যে আপনি একটি তৈরি করতে পারেন করতে চান তাহলে NSArrayআপনি চান কিনা তা autoreleased বা না তার উপর নির্ভর করে এই উপায়ে করুন:

/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];

সম্পাদনা করুন: সমাধান গেয়র্গ Schölly দ্বারা উপলব্ধ এটি এবং অনেক ক্লিনার করছেন একটি ভাল উপায় বিশেষত এখন যে আমরা এআরসি আছে এবং এমনকি autorelease কল করতে হবে না হয়।


7
আমি কি শুধু (এনএসআরএ *) মাইমটেবলআরে করতে পারি?
ভোজ্টো

2
হ্যাঁ, NSMutableArray হিসাবে এনএসআরির একটি সাবক্লাস যা বৈধ।
হলস্কি

4
তবে (NSArray *) এ ingালাই করা এখনও একটি কাস্টটিকে (NSMutable *) পর্যন্ত ব্যাক আপ করতে দেয়। কেস না?
sharvey

1
@ শারভে: হ্যাঁ, এটা ঠিক। আপনি যদি কাস্ট না করেন তবে সরাসরি একটি সাবক্লাসে একটি সুপারক্লাস অর্পণ করেন তবে আপনি একটি সতর্কতা পাবেন। সাধারণত, আপনি একটি অপরিবর্তনীয় অনুলিপি ফিরে আসতে চান, কারণ এটি নিশ্চিত হওয়ার একমাত্র উপায়, আপনার অ্যারেটি সত্যিই সংশোধিত হবে না।
জর্জি স্কলি

1
পূর্বে এটি "আপকাস্টিং" নামে পরিচিত (এনএসআরএ *) মাইম্যাটেবলআরে এবং বিপরীতটিকে "ডাউনকাস্টিং" বলা হয়
ফ্রান্সিসকো

113

আমি দুটি প্রধান সমাধান দুটিই পছন্দ করি:

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

এটি খুব ভূল. সবেমাত্র চেক করা হয়েছে। [পরিবর্তনীয়আরআর অনুলিপি] খালি অ্যারেও দেয়।
durazno

@durazno এটি ভুল নয়। আপনার পরীক্ষা ডাবল পরীক্ষা করুন। যদি [mutableArray অনুলিপি] খালি অ্যারেটি ফিরিয়ে দিচ্ছে, তবে মিউটਟੇবলআরে অবশ্যই একটি খালি অ্যারে হবে। আমার উত্তরটি কেবল তখনই প্রযোজ্য যখন পরিবর্তনযোগ্য অরে শুভ হয়।
রিচার্ড ভেনেবল

যদিও এটি সত্য, আমার মনে হচ্ছে আপনি নিজের উদাহরণে আরও একটি মৌলিক সত্য হারিয়ে ফেলছেন। যেহেতু আপনি মিউটেবলআরিকে শূন্য করার জন্য নির্ধারিত করেছেন তাই এটিকে [mutableArray copy]সরলীকৃত করা যেতে পারে [nil copy]। উদ্দেশ্য- সিতে নীলকে পাঠানো কোনও বার্তা সর্বদা শূন্য থাকবে। "কিছুই না" এবং "এতে কিছু নেই এমন অ্যারে" এর মধ্যে পার্থক্যটি মনে রাখা গুরুত্বপূর্ণ important
mkirk

@ এমকির্ক আসুন এই প্রশ্নটি থেকে হাতছাড়া করবেন না: "আমি কীভাবে এনএসমিটেবলআরিকে এনএসআরে রূপান্তর করব?" 2 টি প্রাথমিক সমাধান রয়েছে এবং তাদের মধ্যে প্রাথমিক পার্থক্য হ'ল যখন পরিবর্তনীয় অ্যারে শূন্য হয় তখন তারা কীভাবে আচরণ করে।
রিচার্ড ভেনেবল


5

উদ্দেশ্য গ

নীচে 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

সুইফট অংশটি পুরোপুরি ঠিক নয়। পরিবর্তনীয় / অপরিবর্তনীয় এবং / এর মধ্যে পার্থক্যের জন্য এখানে এবং এখানে দেখুন । তারা একই নয়। ArrayNSArrayNSMutableArray
ব্রুনো এলি


2
NSArray *array = mutableArray;

এই [mutableArray copy]অ্যান্টিপ্যাটার্ন সমস্ত নমুনা কোড জুড়ে। ক্ষণস্থায়ী এবং ছড়িয়ে পড়া পরিবর্তনের জন্য বর্তমান সুযোগের শেষে বিচ্ছিন্ন হয়ে যাওয়ার জন্য এগুলি বন্ধ করুন।

রানটাইম কোনও পরিবর্তনযোগ্য অ্যারের অপ্রয়োজনীয় অনুলিপিটিকে অপ্টিমাইজ করতে পারে এমন কোনও উপায় নেই যা কেবল সুযোগের বাইরে চলে যায়, 0 এ কমে যায় এবং ভালোর জন্য বিযুক্ত হয়।


একটি বরাদ্দ করা NSMutableArrayএকটি থেকে NSArrayপরিবর্তনশীল ব্যাপারটা গোপন রাখা হবে না (যা কি ওপি প্রশ্ন সম্পর্কে)। যদি এই মানটি অপ্রত্যাশিতভাবে পরিবর্তিত হয় তবে এই জাতীয় মান (উদাহরণস্বরূপ রিটার্ন মান বা সম্পত্তি হিসাবে) প্রকাশ করা সমস্যার ডিবাগ করতে খুব শক্ত হতে পারে। পরিবর্তনীয় মানটি ভাগ করা হওয়ায় এটি অভ্যন্তরীণ এবং বাহ্যিক মিউটেশন উভয়ের ক্ষেত্রেই প্রযোজ্য।
ডেভিড রেনকভিস্ট

সেই অ্যারেটি রূপান্তর করতে আপনাকে [এনএসমিটেবাল অ্যারে অ্যারেওথআরাই: ... বা এর মতো কিছু করতে হবে।
আন্তন ট্রপ্যাশকো

অগত্যা। কেবল এটি একটি NSMutableArrayভেরিয়েবলকে বরাদ্দ করা যথেষ্ট is যেহেতু বস্তুটি কখনই পরিবর্তনযোগ্য অ্যারে হওয়া বন্ধ করে দেয় না, এতে পরিবর্তনের পদ্ধতিগুলি কল করা সফল হবে এবং ভাগ করা ডেটা পরিবর্তন করবে। অন্যদিকে যদি মূল পরিবর্তনীয় অ্যারেটি অনুলিপি করা হয় - এটি পরিবর্তনযোগ্য অ্যারেতে পরিবর্তন করা হয় — এবং তারপরে কোনও NSMutableArrayভেরিয়েবলের জন্য বরাদ্দ করা হয় এবং পরিবর্তিত পদ্ধতিগুলি কল করা হয়, তবে সেই কলগুলি doesNotRespondToSelectorত্রুটিগুলি সহ ব্যর্থ হয় কারণ যে রূপটি পরিবর্তনের পদ্ধতি কলটি পেয়েছিল সেটিতে রয়েছে বাস্তব পরিবর্তনযোগ্য এবং এই পদ্ধতিগুলিতে সাড়া দেয় না।
ডেভিড রেনকভিস্ট

ঠিক আছে, এটিতে বিকাশকারীদের জন্য কিছু যোগ্যতা থাকতে পারে যা টাইপ রূপান্তরকরণের বিষয়ে সংকলক সতর্কতার প্রতি শ্রবণ করে না
আন্তন ট্রপ্যাশকো

1

যদি আপনি মিউটেবিলিটির মাধ্যমে একটি অ্যারে তৈরি করে থাকেন এবং তারপরে কোনও পরিবর্তনযোগ্য সংস্করণটি ফিরে পেতে চান তবে আপনি উত্তরাধিকারের মাধ্যমে কেবল "এনএসএররে" হিসাবে পরিবর্তনীয় অ্যারেটি ফিরিয়ে দিতে পারেন।

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

যদি কলকারীকে (প্রযুক্তিগতভাবে এখনও পরিবর্তনযোগ্য) রিটার্ন অবজেক্টটিকে অপরিবর্তনীয় এনএসআরাই হিসাবে গণ্য করার জন্য আপনি "বিশ্বাস" করেন তবে এটি তার চেয়ে সস্তা বিকল্প [mutableArray copy]

অ্যাপল একমত:

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

উপরোক্ত অনুশীলনটি এখানে আরও বিশদে আলোচনা করা হয়েছে:

সেরা অনুশীলন: রিটার্নের ধরণ যদি এনএসআর্রে হয় তবে রিটার্ন মিউটেটেবলআরআর.কপি বা মিউটেবলআররে করুন


0

আমি দ্রুত 3 এ উত্তরটি অনুসন্ধান করছিলাম এবং এই প্রশ্নটি অনুসন্ধানের প্রথম ফলাফল হিসাবে প্রদর্শিত হয়েছিল এবং আমি উত্তরটি থেকে অনুপ্রেরণা পেয়েছি তাই এখানে সুইফট 3 কোডটি রয়েছে

let array: [String] = nsMutableArrayObject.copy() as! [String]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.