এনএসউজারডেফাল্টস - কী কী আছে তা কীভাবে বলা যায়


208

আমি একটি ছোট আইফোন অ্যাপে কাজ করছি এবং আমি NSUserDefaultsআমার ডেটা অধ্যবসায় হিসাবে ব্যবহার করছি । এটি কেবল কয়েকটি জিনিস যেমন কিছু নাম এবং কিছু সংখ্যা ট্র্যাক করে রাখতে হয় যাতে আমি বুঝতে পারি যে এটিও সহজ করে রাখতে পারি।

আমি এই পৃষ্ঠাটি কিছু রেফারেন্সের জন্য পেয়েছি , তবে আমি মনে করি না এটি আমার প্রশ্নের উত্তর দিতে পারে। মূলত, আমি কোনও মান (বা একটি কী) এর মধ্যে ইতিমধ্যে উপস্থিত রয়েছে কিনা তা যাচাই করতে সক্ষম হয়ে NSUserDefaultsতারপরে সেই অনুযায়ী কিছু করতে চাই।

কিছু উদাহরণ: অ্যাপ্লিকেশনটি শুরু হয়, যদি এটি প্রথমবার শুরু হয় তবে এটি স্বাগত বলে একটি সতর্কতা প্রকাশ করে। এটি প্রথমবার এটি খোলার পরে কিনা তা UserDefaultsপরীক্ষা করে দেখুন To

উদাহরণ 2: এটি বলছে, "হ্যালো [নাম]", যেখানে নাম এমন কিছু যা আপনি প্রবেশ করেছেন। আপনি যদি অ্যাপ্লিকেশনটি খোলেন এবং কোনও নাম না থাকে তবে এটি "হ্যালো ওয়ার্ল্ড" বলা উচিত। আপনি ইতিমধ্যে কোনও নাম প্রবেশ করিয়েছেন এবং সেই অনুসারে কাজ করে কিনা তা আমার পরীক্ষা করা দরকার। নাম সংরক্ষণ করা হবেNSUserDefaults

কিছু এখানে সহায়তা? আমি সত্যিই এটি প্রশংসা করব!

উত্তর:


382

objectForKey:nilএটি উপস্থিত না থাকলে ফিরে আসবে ।


1
আমি মনে করি না আপনি NSUserDephaults এ কোনও প্রাথমিক তথ্য প্রকার সঞ্চয় করতে পারবেন।
kender

12
অ্যাপলের ডকস বলে যে "যদি ব্যবহারকারীদের ডিফল্টগুলিতে একটি বুলিয়ান মান ডিফল্টনামের সাথে যুক্ত হয়, তবে সেই মানটি ফিরে পাওয়া যায় Otherwise নইলে, কোনও ফিরে আসে না।" আমি মনে করি না যে উপরের উত্তরটি BOOL- এর জন্য সঠিক, আপনি নির্ধারণ করতে পারবেন না এটির কোনও সংজ্ঞা নেই বা নেই doesn't আমি মনে করি আপনাকে – dictionaryRepresentationকীটি ব্যবহার করতে হবে এবং পরীক্ষা করতে হবে ।
জেকেল

40
@ জেকেল অনুমান করার পরিবর্তে, আমি এটি পরীক্ষা করেছিলাম (আইওএস 5.1.1 এ), এবং এটি স্পষ্টভাবে সনাক্ত করেছে যে কোনও বিওওএল উপস্থিত ছিল কি না, বলা বিলের মূল্য কী হতে পারে তার থেকে আলাদা। বিওওএল উপস্থিত না থাকায় "অবজেক্টফেরকি" শূন্য করে দেয় কারণ এটি কখনও সেট করা হয়নি।
ডেটাগ্রাহাম 16

8
আপনার যদি কোনও বোল থাকে এবং এটি বুলফোর্কে দিয়ে পরীক্ষা করে দেখুন, তবে @ জেকেল ঠিক আছে, আপনি হ্যাঁ বা না পান। যদি আপনি এটি অবজেক্টফিকে দিয়ে পরীক্ষা করে থাকেন (উত্তরটি সূচিত করে) কীটি সেট না করা থাকলে আপনি শূন্য হয়ে যান।
জিউসেপ গারাসিনো

2
এটি আর কমপক্ষে iOS 6.1 সিমুলেটার হিসাবে কাজ করে না। অবজেক্টফোকি যদি উপস্থিত না থাকে এবং যদি এটি কোনও বোল সহ উপস্থিত থাকে তবে একই মানটি প্রদান করে। আই জামিলখান এর সমাধান কাজ করে
lschult2

98

উপরে উল্লিখিত হিসাবে এটি আদিম ধরণের জন্য কাজ করবে না যেখানে 0 / NO কোনও বৈধ মান হতে পারে। আমি এই কোড ব্যবহার করছি।

NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults];
if([[[defaults dictionaryRepresentation] allKeys] containsObject:@"mykey"]){

    NSLog(@"mykey found");
}

এটি আমাকে বাঁচায়। ধন্যবাদ!
BalestraPatrick

আদিমদের মতো কাজ করার সময় এটি সঠিক উত্তর BOOL। এটি NOবিপরীতভাবে সেট না করে সেট করার মধ্যে সঠিকভাবে আলাদা করবে objectForKey:
ডিভাইস 1

@ ডিভিওএস 1 - যদি কীটি অনুপস্থিত থাকে তবে শেষ পর্যন্ত কোনও বা অন্য কোনও ডেটা টাইপ করার জন্য প্রোগ্রামারটির উদ্দেশ্য নির্বিশেষে objectForKey:ফিরে আসবে । কোনও আদিম উপস্থিত থাকলে কীটি কোনও আদিম মানের সাথে যুক্ত হলেও ফিরে আসে না । nilBoolobjectForKey:nil
টেড হপ্প

এটি সঠিক উত্তর: স্পষ্টতই, গৃহীত উত্তরগুলি ভুল কারণ অবজেক্টফেরি 0 টি শূন্যের সাথে বিভ্রান্ত করে, তাই এটি কাজ করতে পারে না। আইওএস 4.3 থেকে 10.2.1 এ সফলভাবে পরীক্ষিত
ক্রিসোট্রিব্যাক্স

আমি জানি এটি পুরানো, তবে কেবলমাত্র এখনই এই তথ্যটির দরকার ছিল, আমার এটি উল্লেখ করতে হবে যে 'অন্তর্ভুক্ত অবজেক্ট:' রেফারেন্সটির অর্থ কেবল এটি: বস্তু। চাবি না। আইওডাব্লু, আপনার শিরোনামের ফাইলটিতে যদি আপনি সংজ্ঞায়িত হন: # ডিফাইন কেএমওয়াইকে @ "মাইকি" "কন্টিজঅবজেক্ট" 'কে মাইকি' খুঁজছে না, এটি 'মাইকি' খুঁজছে। 'KMyKey' ব্যবহার করা সর্বদা 'না' ফেরত আসবে।
বিল নরম্যান

55

objectForKey:পদ্ধতি ফিরে আসবে nilযদি মান বিদ্যমান নেই। এখানে একটি সাধারণ IF / THEN পরীক্ষা রয়েছে যা আপনাকে জানাবে যে মানটি শূন্য হলে:

if([[NSUserDefaults standardUserDefaults] objectForKey:@"YOUR_KEY"] != nil) {
    ...
}

6

" অবজেক্টফেরকি উপস্থিত না থাকলে শূন্য করবে। " এটি আসবে এবং এটি হয় শূন্যের মান সহ একটি পূর্ণসংখ্যা বা বুলিয়ান (অর্থাত্ বুলিয়ান বা নন)।

আমি এটি 5.1 এবং 6.1 উভয়ের জন্য সিমুলেটারে পরীক্ষা করেছি। এর অর্থ হ'ল আপনি "অবজেক্ট" জিজ্ঞাসা করে ইন্টিজার বা বুলিয়ানগুলির জন্য সত্যই পরীক্ষা করতে পারবেন না। আপনি যদি এটি "শূন্যতে সেট" না হয়ে "সেট না করে" চিকিত্সা করতে কিছু মনে করেন না তবে আপনি পূর্ণসংখ্যার জন্য এটি থেকে দূরে যেতে পারেন।

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

আমার নিজের সমস্যার জন্য, যা আমাকে এখানে পাঠিয়েছে, আমি আমার বুলিয়ানটির শব্দার্থবিজ্ঞানের পরিবর্তনটি শেষ করেছি যাতে আমার কাঙ্ক্ষিত ডিফল্টটি সম্মতিতে মানটি নির্ধারিত হয় না। যদি এটি কোনও বিকল্প না হয় তবে আপনাকে বুলিয়ান ছাড়া অন্য কিছু হিসাবে সংরক্ষণ করতে হবে এবং নিশ্চিত করা উচিত যে আপনি হ্যাঁ, কোনও, এবং "সেট নয়" এর মধ্যে পার্থক্য বলতে পারেন।


আমি এটি নিশ্চিত করেছি, তবে একটি সহজ সমাধান আছে; কেবল নতুন বস্তুর আক্ষরিক বা বাক্সযুক্ত অভিব্যক্তি ব্যবহার করুন। @0পরিবর্তে 0, @NOপরিবর্তে NO, বা সহজভাবে @(variable)তাদের সম্পর্কে এখানে পড়ুন।
কাকা

1
কিছুটা দেরি হলেও newbies এর সুবিধার জন্য: এটি ভুল। অবজেক্ট (forKey) ব্যবহারকারীর ডিফল্ট মানগুলিতে 0 তে সেট করা হয় এবং বুলস মিথ্যাতে সেট করা হয়, সঠিকভাবে অ-শূন্যকে ফিরিয়ে দেবে। যদি মানটি সেট করা থাকে তবে পরীক্ষার জন্য আপনি যদি বুল (ফোরকি) ব্যবহার করেন তবে আপনি সমস্যায় পড়তে পারেন (কারণ যদি মানটি মিথ্যাতে সেট করা থাকে তবে বুল (ফোরকি) 'মিথ্যা' ফিরে আসবে, যদিও আপনি 'সত্য' প্রত্যাশা করছেন।)
thecloud_of_ অজানা

5

সুইফট 3/4:

এখানে আন্তঃ / ডাবল / ফ্লোট / বুল কী-মান ধরণের জন্য একটি সাধারণ এক্সটেনশন যা ইউজারডেফাল্টসের মাধ্যমে অ্যাক্সেস করা অন্যান্য ধরণের ptionচ্ছিক-রিটার্ন আচরণের অনুকরণ করে।

( 30 আগস্ট 2018 সম্পাদনা করুন: লিওর পরামর্শ থেকে আরও দক্ষ সিনট্যাক্স সহ আপডেট হয়েছে।)

extension UserDefaults {
    /// Convenience method to wrap the built-in .integer(forKey:) method in an optional returning nil if the key doesn't exist.
    func integerOptional(forKey: String) -> Int? {
        return self.object(forKey: forKey) as? Int
    }
    /// Convenience method to wrap the built-in .double(forKey:) method in an optional returning nil if the key doesn't exist.
    func doubleOptional(forKey: String) -> Double? {
        return self.object(forKey: forKey) as? Double
    }
    /// Convenience method to wrap the built-in .float(forKey:) method in an optional returning nil if the key doesn't exist.
    func floatOptional(forKey: String) -> Float? {
        return self.object(forKey: forKey) as? Float
    }
    /// Convenience method to wrap the built-in .bool(forKey:) method in an optional returning nil if the key doesn't exist.
    func boolOptional(forKey: String) -> Bool? {
        return self.object(forKey: forKey) as? Bool
    }
}

এগুলি এখন অন্যান্য অন্তর্নির্মিত পদ্ধতিগুলি (স্ট্রিং, ডেটা, ইত্যাদি) এর সাথে আরও সুসংগত। পুরানোগুলির স্থানে গেটের পদ্ধতিগুলি ব্যবহার করুন।

let AppDefaults = UserDefaults.standard

// assuming the key "Test" does not exist...

// old:
print(AppDefaults.integer(forKey: "Test")) // == 0
// new:
print(AppDefaults.integerOptional(forKey: "Test")) // == nil

2
আমি return self.object(forKey: key) as? Intএকবারে মান সন্ধান করতে পছন্দ করব ।
লিও

3

আমি শুধু এই মাধ্যমে গিয়েছিলাম, এবং সব আপনার উত্তর আমার জন্য একটি ভাল সমাধানের দিকে সহায়তা করেছিল। আমি প্রস্তাবিত পথে যেতে প্রতিহত করেছি, কেবল কারণ পড়তে এবং বুঝতে বুঝতে আমার অসুবিধা হয়েছিল।

আমি যা করেছি তা এখানে। আমার কাছে "_ট্যালকটিভেটিভ" নামে একটি ভেরিয়েবলের চারপাশে একটি বিওওএল বহন করা হয়েছিল।

আমি যখন আমার ডিফল্ট (এনএসউজারডেফাল্টস) অবজেক্টটি সেট করি, তখন আমি এটিকে একটি অবজেক্ট হিসাবে সেট করেছিলাম , কারণ আমি যদি পরীক্ষা করে দেখতে পারি যে এটি শূন্য ছিল কিনা :

//converting BOOL to an object so we can check on nil
[defaults setObject:@(_talkative) forKey:@"talkative"];

তারপরে যখন আমি দেখতে গিয়েছিলাম এটি বিদ্যমান আছে কিনা, আমি ব্যবহার করেছি:

if ([defaults objectForKey:@"talkative"]!=nil )
  {

তারপরে আমি বস্তটিকে একটি BOOL হিসাবে ব্যবহার করেছি:

if ([defaults boolForKey:@"talkative"]) {
 ...

এটি আমার ক্ষেত্রে কাজ করে বলে মনে হচ্ছে। এটি আমার কাছে আরও ভিজ্যুয়াল বোধ তৈরি করেছে।


এটি আমার পক্ষে কাজ করেছে ([ডিফল্ট বুলফোর্ডকি: @ "কথাবার্তা"])
ভিনিশ টিপি

3

এই ছোট crumpet চেষ্টা করুন:

-(void)saveUserSettings{
NSNumber*   value;

value = [NSNumber numberWithFloat:self.sensativity];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:@"sensativity"];
}
-(void)loadUserSettings{
    NSNumber*   value;
    value = [[NSUserDefaults standardUserDefaults] objectForKey:@"sensativity"];
    if(value == nil){
        self.sensativity = 4.0;
    }else{
        self.sensativity = [value floatValue];
    }
}

সবকিছুকে একটি বস্তুর মতো আচরণ করুন। আমার জন্য কাজ করে বলে মনে হয়।


3

সুইফট সংস্করণ পেতে Bool?

NSUserDefaults.standardUserDefaults().objectForKey(DefaultsIsGiver) as? Bool

1
কেন ব্যবহার boolForKeyকরবেন না ? NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
জাল

1
boolForKeyফিরে আসবে Boolএবং না Bool?, তাই কীটি না থাকলে আপনি পাবেন falseএবং পাবেন নাnil
বেন

3

UserDefaultsএই সমাধানটি অনুলিপি না করে একবার প্রসারিত করুন :

extension UserDefaults {

    func hasValue(forKey key: String) -> Bool {
        return nil != object(forKey: key)
    }
}

// Example
UserDefaults.standard.hasValue(forKey: "username")

0

সুইফট 3-তে, আমি এইভাবে ব্যবহার করেছি

var hasAddedGeofencesAtleastOnce: Bool {
    get {
        return UserDefaults.standard.object(forKey: "hasAddedGeofencesAtleastOnce") != nil
    }
}

উত্তর মহান আপনি যে একাধিক বার ব্যবহার করতে না পারেন তাহলে হয়।

আমি আসা করি এটা সাহায্য করবে :)


-1

সুইফট 3.0

if NSUserDefaults.standardUserDefaults().dictionaryRepresentation().contains({ $0.0 == "Your_Comparison_Key" }){
                    result = NSUserDefaults.standardUserDefaults().objectForKey(self.ticketDetail.ticket_id) as! String
                }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.