簡體   English   中英

NSUserDefault setObject的現代目標C語法是什么?

[英]What is the modern objective c syntax for NSUserDefault setObject?

我剛剛向同事展示了我的代碼,他提醒我使用現代的目標c語法。 我感覺像個白痴,因為我不知道他的意思。 如何轉換:

NSUserDefaults *rankDate = [NSUserDefaults standardUserDefaults];
[rankDate setObject:self.date forKey:@"rankDate"];
[rankDate setObject:[NSNumber numberWithInteger:self.date.people] forKey:@"people"];
[rankDate synchronize];

變成“現代目標C語法”?

我已經這樣做了多年,卻從未聽說過這種語法。 我應該擔心嗎?

既然它出現在評論中,我想我會繼續並將其提升為答案,這樣它就不會迷路。 更好的代碼是:

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:self.date forKey:@"rankDate"];
[ud setInteger:self.date.people forKey:@"people"];

我做了一些更改。 首先, rankDate作為standardUserDefaults的名稱是沒有意義的,並且非常容易引起誤解。 其次,它使用setInteger:forKey:而不是使用NSNumber包裝器。 沒有必要。 最后,它擺脫了synchronize 這很少能滿足您的實際意思,尤其是在iOS上( 它只是在等待 )。

也就是說,整個對象模型令人難以置信。 似乎“日期”不是日期,“人”不是人,並且您將相同的數據保存了兩次。 但這是一個單獨的問題。 最主要的是,這里沒有適當地使用“現代Objective-C”。 您不應該使用NSNumber (即@(...) ),並且NSUserDefaults上沒有下標(即ud[@"..."] )。

(我相信setInteger:forKey:setInteger:forKey:所有其他特定的set方法的NSUserDefaults解釋了為什么它沒有下標。這將是特殊情況的對象,這將使代碼不一致並在不需要時鼓勵NSNumber包裝)

你說你原來有

[NSNumber numberWithInteger:self.date.people]

然后您的同事將其更改為

@(self.date.people)

這是因為@()語法是將非Objective-C表達式轉換為NSNumber簡寫形式。

例如, 5是一個int 這不是Objective-C類型,即無法將其強制轉換為id 因此,如果您需要將其轉換為id ,那么您將使用[NSNumber numberWithInt:5] (使用“舊的ObjC”)。 但是,這很長且乏味,所以您要做的是@5 ,它將是“新的ObjC”。

@the_UB鏈接到頁面

...此轉換器建議對您的代碼進行其他更改,包括:...
•轉換為文字,因此[NSNumber numberWithInt:3]類的語句變為@3
•使用下標,因此[dictionary setObject:@3 forKey:key]這樣的語句成為dictionary[key] = @3

使用下標,因此類似[dictionary setObject:@3 forKey:key]的語句將成為dictionary[key] = @3

我在關於“采用現代Objective-C”的Apple文檔的底部找到了它。

PS似乎NSUserDefaults不支持下標語法,我發現了一個允許以下操作的github項目: https ://gist.github.com/tonyarnold/3196558

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM