2017-06-12 9 views
0

Swiftでクラス/構造体を設計するときに、いつオプション型を使用するべきかを特定するベストプラクティスは何ですか?Swiftでオプションのタイプを使用する際の原則は?

たとえば、JSONレスポンスをPhotoオブジェクトにマッピングし、プロパティがphotographerNameで、これは単なる文字列です。応答によってフィールドphotographerNameの空の文字列を受け取ることがあります。

PhotoオブジェクトはString?タイプを使用し、それをnilに割り当てる必要がありますか?またはStringタイプを使用し、空の文字列に設定しますか?

答えて

1

あなたが使用したいのはあなた次第ですが、nilのような応答を受け取った場合は、optionalを使用してコード内で処理する必要があります。

if let photographerName = photo.photographerName { 
    // use photographerName in here 
} 
+2

nilをデフォルトの 'init(photographerName:String?= nil)'として使用する場合は、initが1つだけ必要です。 – vikingosegundo

1

それは本当にあなたが使用しようとしてアプリケーションのアーキテクチャとデータ構造に依存します:photographerNameが値を持っているかどうかを確認するためにあなたのコード内の

struct Photo { 
    let photographerName: String? 

    init(photographerName: String? = nil) { 
     self.photographerName = photographerName 
    } 
} 

そして、このような

何かアプリケーションで

アプリケーションアーキテクチャでオプションの連鎖をどのように適切に使用するかを記述する規則はありません。

最初に、われわれはoptional chainingを知っているはずです。

オプションの連鎖は、照会し、現在はゼロであるかもしれないオプションのプロパティ、メソッド 、および添字を呼び出すためのプロセスです。 オプションに値が含まれている場合は、プロパティ、メソッド、または添字の呼び出し が成功します。オプションがnilの場合、プロパティ、メソッド、またはサブスクリプト 呼び出しはnilを返します。チェーン内のリンクがnilであれば、複数のクエリを一緒にチェーンすることができ、 チェーン全体がうまく機能しなくなります。

私の経験に基づいて、私のモデルが何らかの関係や財産を持つことができるかどうかを明確に定義できなかった場合、私はデータ構造にオプションの値を使用しています。

例:

struct User { 
    let name: String 
    let email: String 
    var friends: [String]? 

    init(name: String, email: String) { 
     self.name = name 
     self.email = email 
    } 
} 

let user = User(name: "Oleg", email: "[email protected]") 

私は、ユーザーが名前とメールアドレスを持っていますが、彼はすべての友人を持っているかどうかはわからないということを知っています。また、このようにして、私のコードがnilオブジェクトの操作の実行を妨げる可能性があります。

あなたが記述する場合は、実際にはアプリケーションと要件のアーキテクチャに依存します。たとえば、photographerNameが空であるかどうかを示すプレースホルダを表示する必要がありますか? photographerNameプロパティを使用している追加操作はありますか?

関連する問題