কীভাবে এনএসএনمبر বাড়ানো যায়


108

আমি কীভাবে এনএসএনمبر বৃদ্ধি করব?

অর্থাৎ মাইএনএস নাম্বার ++


2
মনে রাখবেন: ব্যবহার করার সময় NSNumber *, সর্বদা আদিম ধরণেরগুলি যথেষ্ট কিনা তা পরীক্ষা করে দেখুন।
WKS

1
আমি অবাক হয়েছি যে এটি করার দ্রুত / অনুকূলিতকরণের কোনও জবাব সরবরাহ করার কোনও উত্তর নেই, কারণ কেবল মূল্য বাড়ানোর জন্য আপনার জিজ্ঞাসা করা, একত্রিত করা এবং নতুন অবজেক্ট তৈরি করা দরকার, সুতরাং লুপে এটি করা সময় সাপেক্ষ হতে পারে।
পেট্রাভি

উত্তর:


123

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


একটি ইনক্রিমেন্ট করার জন্য NSNumber, আপনাকে তার মান, বাড়ানো এবং এটি একটি নতুনতে সঞ্চয় করতে হবে NSNumber

উদাহরণস্বরূপ, NSNumberএকটি পূর্ণসংখ্যা ধরে রাখার জন্য :

NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];

অথবা NSNumberএকটি ভাসমান-পয়েন্ট নম্বর ধারণের জন্য :

NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];

62
কোর ডাটাতে আমি এনএসএনम्बर বৈশিষ্ট্যগুলিকে ঘৃণা করি এটিই প্রথম কারণ। NSNumber এর সাথে কাজ করতে এবং গণিতটি সম্পাদন করতে এতটা অসুবিধে হয়।
খ্রিস্টান শ্লেনস্কর

আবার এনএসএনবার শূন্যের সাথে জঞ্জাল মূল্য দিতে গিয়ে কাজ করেনি।
জিগনেশ বি

দুঃখিত, কি ...দাঁড়ায়? একটি ছদ্ম-কোড রেফারেন্স ঠিক আছে? ...
এক্সকোডটি

@ বোল্ডার_রুবি আপনার যে ...কোনও সংখ্যার জন্য কেবল একটি স্থানধারক।
Itai Ferber

126

NSNumberবস্তু অপরিবর্তনীয়; আপনি যেটা করতে পারেন তা হ'ল আদিম মান ধরে নেওয়া, বৃদ্ধি করা তারপরে ফলাফলটিকে তার নিজের NSNumberঅবজেক্টে গুটিয়ে রাখুন:

NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];

28
আধুনিক ভাষা: 1, উদ্দেশ্য-সি: 0.
ডিভিস

77

যে কেউ এক্সকোডের সর্বশেষতম সংস্করণটি ব্যবহার করছেন (এটি 4.4.1, এসডিকে 5.1 হিসাবে লিখছেন), অবজেক্ট লিটারাল ব্যবহার করে আপনি কোডটি আরও কিছুটা সাফ করতে পারেন ...

NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2

সহজ ক্রিয়াকলাপ করার জন্য বক্সিং এবং সমস্ত কিছু আনবক্সিংয়ের সাথে মোকাবিলা করার জন্য এখনও এক ধরনের বেদনা, তবে এটি আরও ভাল হচ্ছে বা কমপক্ষে সংক্ষিপ্ত হয়ে উঠছে।


6
@ সোফটআলি আরও ওবিজেসি লিটারাল দেখতে clang.llvm.org/docs/ObjectiveCLiterals.html দেখুন! খুব কাজে লাগানো ইমো
chown

1
এবং এই ক্ষেত্রে আপনি x - @ (x.intValue + 1) ব্যবহার করতে পারেন, যদিও অনেকে অ-সম্পত্তি সম্পত্তি হিসাবে ডট স্বীকৃতি ব্যবহার করতে পছন্দ করেন না। এটি ছোট, তবে ডট স্বরলিপিটির অপব্যবহার বলা যেতে পারে।
ডানকান সি

@ বোল্ডার_রবি, এটি পুনরায় নিযুক্ত করা হয়েছে। এনএসএন নামগুলি অপরিবর্তনীয়, সুতরাং মানটিকে "ইনক্রিমেন্ট" করতে আপনাকে অবশ্যই এটিকে নতুন মানটিতে পুনরায় সই করতে হবে।
shorttuffsushi

30

এনএস নাম্বারগুলি অপরিবর্তনীয়, আপনাকে একটি নতুন উদাহরণ তৈরি করতে হবে।

// Work with 64 bit to support very large values
myNSNumber = [NSNumber numberWithLongLong:[myNSNumber longLongValue] + 1];

// EDIT: With modern syntax:
myNSNumber = @([myNSNumber longLongValue] + 1);

24

এগুলি সব একসাথে রাখুন এবং আপনার কাছে রয়েছে:

myNSNumber = @(myNSNumber.intValue + 1);

আপনি কি এখানে আমার মাইএনএস নাম্বারের মান পুনরায় বরাদ্দ দিচ্ছেন না? আমি ভেবেছিলাম যে এটি অনুমোদিত হয়নি কারণ NSNumberবস্তুগুলি অপরিবর্তনীয় (?)
বোল্ডার_রুবি

1
আপনি একটি নতুন এনএসএনম্বার অবজেক্ট তৈরি করছেন। myNSNumber একটি পয়েন্টার (NSNumber *), এবং আপনার কাজ শেষ হয়ে গেলে একটি নতুন মান রয়েছে।
JLundell

3

আমি ডট এক্সপ্রেশন পছন্দ করি কারণ এটি আরও সংক্ষিপ্ত এবং এজন্য আইওএস প্রথম স্থানে এটি সমর্থন করে:

myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];

ডট স্বরলিপিটি আপনি যা ভাবেন তা করছে না এবং সময়ে সময়ে ধীর হতে পারে (যদি "সম্পত্তি" এর জন্য কোনও সংশ্লেষিত অ্যাক্সেসর উপস্থিত না থাকে (আপনার ক্ষেত্রে ইনটাল্যু থাকে না। এনএসএনবার-এর
মোটি শ্নিয়র

2

আপনি যদি এটি অবিচ্ছেদ্য মান সঞ্চয় করতে ব্যবহার করেন:

myNSNumber = @(myNSNumber.longLongValue + 1);

ভাসমান পয়েন্ট স্টাফগুলির জন্য সংক্ষিপ্ত উত্তরটি নিম্নোক্ত, তবে এটি করা একটি খারাপ ধারণা, আপনি যথাযথতা হ্রাস করবেন এবং আপনি যদি পরে [মাইএনএস নাম্বার ইক্যুয়াল: @ (4.5)] এর মতো কোনও ধরণের তুলনা করছেন তবে আপনি অবাক হতে পারেন :

myNSNumber = @(myNSNumber.floatValue + 1);

অবজেক্টিক-সি-তে বস্তু হিসাবে প্রতিনিধিত্বকারী ভাসমান পয়েন্ট সংখ্যাগুলিতে আপনার যদি গণিত করা প্রয়োজন (যেমন আপনাকে যদি অ্যারে, অভিধান ইত্যাদিতে এগুলি রাখার প্রয়োজন হয়) আপনার ব্যবহার করা উচিত NSDecimalNumber


আপনি যদি ডাউনটাতে যাচ্ছেন, তবে পাশাপাশি গঠনমূলকও হতে পারেন এবং কেন তা বলছেন।
lms

আপনার উত্তরটি বোঝায় যে এটি NSNumber যা চারিদিকের সমস্যাগুলির পরিচয় দেয়। এটি সঠিক নয়, এনএসএনম্বারের স্কেলারের ধরণের মতো গোলাকার আচরণ রয়েছে। এছাড়াও আপনার এনএসডিসিমাল নাম্বার ব্যবহারের পরামর্শটি বেশ বিরক্তিকর। সেখানে আপনি বোঝাচ্ছেন যে আপনার যদি প্রথম নাগরিক অবজেক্টগুলি অম্বজেক্টিভ-সিতে প্রয়োজন হয় তবে এটি প্রয়োজনীয়। তবে অবশ্যই অবজেক্টগুলিতে সংখ্যাগুলি umbers এনএসডিসিমাল নাম্বারগুলির উচ্চতর নির্ভুলতা রয়েছে তবে তাদের সাথে গোলাকার ত্রুটিও ঘটতে পারে। এবং: ওপেন ইনক্রিমেন্টিং সম্পর্কে জিজ্ঞাসা করে, আপনার উত্তর ভাসা এবং ডাবল পাটিগণিত সহ। তবে তাদের কোনও বাড়তি পরিমাণ নেই, কারণ তাদের কোনও প্রাকৃতিক সসেসর নেই।
ভাইকিংগুন্ডো

@ লাইকিংগুন্ডো এটি কোনও এনএসএনবারকে একটি ফ্লোটে রূপান্তর করছে যা নির্ভুলতার ক্ষতি হতে পারে কারণ এনএস নাম্বার সংখ্যাগুলি বিমূর্তভাবে স্টোর করে যেখানে ভাসমান বেস 2, সুতরাং এটি এনএসবার্বের দোষ নয়, বরং সামনে এবং পরে রূপান্তরটির। এবং এনএসডিসিমাল নাম্বারগুলি বেস 10 গাণিতিকের জন্য গোলাকার ত্রুটি সৃষ্টি করবে না এবং সেগুলি গাণিতিকের জন্য ডিজাইন করা হয়েছে, ডকটি পড়ুন। ওপি একটি এনএসএনবার বাড়ানোর বিষয়ে জিজ্ঞাসা করেছিল, এবং আমি তাকে অবিচ্ছেদ্য মামলার জন্য একটি সঠিক এবং পাঠযোগ্য উত্তর দিয়েছি, এবং ভাসমান পয়েন্ট মামলার জন্য একটি উত্তরও দিয়েছিলাম তবে এর বিরুদ্ধে পরামর্শ দিয়েছিলাম এবং তারপরে আরও ভাল পরামর্শের সাথে অনুসরণ করেছি।
lms

একটি উদাহরণ ম্যান্টিসা x 10 এক্সপোঞ্জার হিসাবে প্রকাশ করা যেতে পারে এমন কোনও সংখ্যার প্রতিনিধিত্ব করতে পারে যেখানে ম্যান্টিসা দীর্ঘ দশমিক পূর্ণসংখ্যা 38 টি দৈর্ঘ্য এবং লম্বা -128 এবং 127 এর মধ্যে একটি পূর্ণসংখ্যা every প্রতিটি সংখ্যার মতো প্রকাশ করা যায় না। এছাড়াও ওপি সহজে ইনক্রিমেন্টিংয়ের জন্য বলেছিল। এনএসডিসিমাল নাম্বার এটি সরবরাহ করে না। এবং তারপরেও আপনার উত্তরটি বোঝায় যে আপনার অবজেক্ট স্পেসে এনএসডি ডেসিমাল সংখ্যা দরকার need এটা ভুল।
ভাইকিংগুন্ডো

ড্যুড আমি আমার উত্তরটির সাথে সত্যিকারের সাহায্যকারী হওয়ার চেষ্টা করছিলাম, এবং ভাবা হয়েছিল ডাউনটা হ'ল কারণ আমার কিছু ভুল হয়েছে এবং আমি ভেবেছিলাম যে আমি নতুন কিছু শিখতে পারি। আমি এখন দেখতে পাচ্ছি কেস নয়। আপনার মন্তব্যগুলি কোনও অর্থহীন নয় এবং আমি প্রস্তাব দিচ্ছি যে আপনি সংখ্যা সিস্টেমে একটি পঠিত ইউও থাকবেন কারণ একটি বেস 10 নম্বরের কাজ করে। (পুনরায় আপনার উক্তি) বেস 10 নম্বরের জন্য কোনও গোলাকার ত্রুটি সৃষ্টি করবে না, আমি নির্ভুলতা সম্পর্কে কিছুই বলিনি, কেবল নির্ভুলতা, তবে 128 দশমিকটিও যথেষ্ট পরিমাণে নির্ভুলতা রয়েছে।
lms

0

ভবিষ্যতের ব্যবহার সহজ করতে একটি বিভাগ ব্যবহার করুন। এখানে একটি প্রাথমিক ধারণা।

 - (void)incrementIntBy:(int)ammount {
      self = [NSNumber numberWithInt:(self.intValue + ammount)];
 }

বিতৃষ্ণা। এমন একটি বিভাগ যা স্ব-প্রতিস্থাপন করে এমন একটি উদাহরণ পদ্ধতি প্রয়োগ করে?!? এটা মারাত্মক কদর্য। ফলস্বরূপ এনএসএনমারের একটি অকার্যকর রিটার্ন রয়েছে এমন একটি উদাহরণ পদ্ধতি কেন লিখবেন না।
ডানকান সি

NSNumber অপরিবর্তনীয় হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং এই বিভাগ পদ্ধতিটি অনুমিত অপরিবর্তনীয়তা (এমনকি যদি নিজেকে প্রতিস্থাপন করে) লঙ্ঘন করছে। আরও উন্নততর নকশা করা এই জাতীয় বিভাগটি পরিবর্তে NSNumber এ একটি নতুন ইনিশিয়ালিসার যুক্ত করবে: + নাম্বার বাইক্রিটমেন্টিংআউমনফ: (ইনট) পরিমাণ;
মোটি শ্নিউর

0

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

আমি একটি অভিধানে একটি এনএস নাম্বার সংরক্ষণ করছি এবং আমি এটি বৃদ্ধি করতে চাই। আমি এটি পেয়েছি, এটিকে একটি ইনটে রূপান্তর করি, এনএসএনম্বারে রূপান্তর করার সময় এটিকে বৃদ্ধি করি, তারপরে আবার অভিধানে রাখি put

পুরাতন কোড

 NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
 int correctValue = [correct intValue];
 correct = [NSNumber numberWithInt:correctValue + 1];
 [scoringDictionary removeObjectForKey:@"correct"];
 scoringDictionary[@"correct"] = correct;

নতুন কোড

NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.