2016-11-26 23 views
2

任何時候當你結合兩個或更多的標誌時,你使用|。除了Swift,它將其改爲使用數組語法。但現在,我盯着本地通知一些文件做這個:目標C是否開始使用+而不是|合併比特?

requestAuthorizationWithOptions: (UNAuthorizationOptionAlert + UNAuthorizationOptionSound) 

如果這些是枚舉。我無法找到+運營商突然以這種方式開始工作的地方。我沒有看到任何指標|不能只是用來代替。我意識到,也許這些枚舉本身可能恰好適用於它們的本質和它們的添加方式,但我懷疑我的最後一個陳述。

+1

從某種意義上說,它們「只是位模式」(並且假設標誌本身是位掩碼),爲什麼不按照您期望的那樣做?不過,這絕對是非正統的。 – CodaFi

+8

如果它們是唯一的位標,加上等於它們。但只有在這種情況下。 –

+3

@CodaFi要清楚的是,只有在沒有任何值具有任何公共位時才添加位掩碼。使用加法是一個壞主意,因爲它是有風險的,只能在可能會改變的特定條件下工作。 – rmaddy

回答

3

因此,要編纂以上評論中的討論:否,+不是|的替代品。 a + b == a | b當且僅當ab具有不共享比特的比特模式;在選項enum的情況下,這通常是正確的(因爲以這種方式表示選項很有用),但不能保證。這是你在上面看到的情況,雖然好的代碼將通過使用按位或者更加明確(和可讀)。

+2

避免使用「+」的另一種情況是,諸如「UNAuthorizationOptionAlert」之類的選項的實際值未知,因此您無法安全地假定「+」將始終有效。它可能在iOS的一個版本中運行,然後在更高版本中運行。 – rmaddy

+0

是的。蘋果公司一直在重寫所有法律,所以我不確定蘋果公司是否在爲Obj C做過這麼多事情後做過這樣的事情,或者如果這篇文檔和隨後的教程編寫人員僅僅因爲懶惰,愚蠢或者更糟,他們實際上知道數學並將它扔到那裏,因爲他們想成爲uberl177 ......我討厭超級代碼風格的代碼,那些混淆或使用大量依賴性的單行程序會減慢速度。謝謝回答! –

相關問題