[英]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.