2016-04-24 8 views
1

次のことがすべてのデバイスで機能すると想定するのは安全でしょうか?NSCalendarを強制アンラッピングで初期化する

let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 

私は、アプリのローカライズ(またはTBHもの)には専門家だので、私はグレゴリオ暦は、すべてのデバイス上で利用できるようになりますかはわかりません。アプリがこのカレンダーを使用する方法はユーザー向きではないので、ユーザーが使用しているカレンダーは本当に気にしません。上記の初期化が常に機能することを確認したいだけです。

+2

「ガードレットcal = NSCalendar(calendarIdentifier:NSCalendarIdentifierGregorian)else {return}」 –

+0

アプリではカレンダーを使って統計情報を計算しています(ユーザーには表示されません。アプリの最適化と解析)、正しいカレンダーが利用できない場合、それは問題です。私は決して気にしていないとは言えません。 – TimSim

+0

ちょうど現在のカレンダーを使用してください –

答えて

1

特に実装が隠されているSDKを扱う場合は、プログラミングにおいて100%安全です。私は定数についての同様の質問に答えたNSNotFoundhere

NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!は安全ですか?理想的には、AppleがSDKを変更しないことを選択した場合、またはNSCalendarイニシャライザのバグのない実装を提供している場合です。防御コーディングが行われる限り、2つの選択肢があります。

ラップレオDabusはコメントで示唆されているようにguardのコード:未来プルーフ用

guard let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) else { return } 

を、Appleが(NSNotFoundで見られるような) NSCalendarIdentifier定数の可用性や実装を変更することがあります。さらに安全性を高めるために、定数のメモリ位置を確認します

if let str: String = NSCalendarIdentifierGregorian { 
    if let _: UnsafePointer<Void> = unsafeAddressOf(str) { 
     // NSCalendarIdentifierGregorian is defined on your platform 
    } 
} 

をそれだクリーナーのObjective-Cで少し:私はアップルでは動作しませんし、任意の財団の可用性を保証することはできません

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wtautological-compare" 
BOOL found = (&NSCalendarIdentifierGregorian != NULL); 
#pragma clang diagnostic pop 
if (found) { 
    // safe 
} 

クラス。

+0

ありがとうございます。問題は、nilが返された場合にアプリケーションがクラッシュするということではありません(クラッシュしないようにコードを 'ガード'する方法を知っています)。しかし、グレゴリオ暦の場合には重要な機能を再設計する必要がありますカレンダーをすべてのデバイスでインスタンス化することはできません。私は間違った言葉を述べたかもしれない。グレゴリオ暦のNSCalendarをすべてのデバイスでインスタンス化できるかどうか – TimSim

関連する問題