私は疑問に思っていました:シンボルに完全に裏打ちされ、コンパイラーによってチェックされやすいスカラー値の順序付けられていないリストを宣言するための最良の方法は何ですか?
LetterSpacing
アクセスしてコードで使用する値のリストをシンボルを介して宣言するとします。
私の理解では、次のenum
ように迅速に宣言する必要があります。
enum LetterSpacing: Double {
case Short = 1.0
case Medium = 2.0
case Large = 3.0
}
これは正常に機能し、コンパイラチェックを取得しますが、厄介な部分はLetterSpacing.XXX.rawValue
、基になる値にアクセスするたびにアクセスする必要があることです。.rawValue
私悩ますビットはどこでもこれを指定する必要があります。
struct
3で宣言するのは意味がないか不適切だと思いstatic let Short = 1.0
ます。
では、そのような場合をどのように処理しますか?Short
列挙型を独自の値として機能させるために、既存のタイプに何らかのプロトコル/拡張の迅速な魔法を追加することは可能ですか?(つまりlet size = LetterSpacing.Short
、タイプDouble
であり、値は1.0
)
enum
複数の理由のために好ましいであろう。
まず、enum
実際にはメモリフットプリントが小さくなります。これは、Swiftがenum
値を1バイトに最適化し(生の値が何であるかに関係なく)、値を呼び出すときにのみ完全な値を取得するrawValue
ためenum
です。次のコードを遊び場に貼り付けて確認します。
struct LetterSpacingS {
static let Short: Double = 1.0
}
enum LetterSpacingE: Double {
case Short = 1.0
}
sizeofValue(LetterSpacingS.Short)
sizeofValue(LetterSpacingE.Short)
double
しながら、8バイトでenum
ちょうど1です。
第二に、最初のポイントの重要性は、メモリフットプリントだけにとどまりません。それは私たちのプログラムの実行効率にも適用できます。構造体の2つの値を比較する場合は、8バイトを比較しています。2つの列挙値を比較する場合は、1バイトだけを比較します。この特定のケースでは、比較するバイト数が1/8です。そして、これはちょうどダブルです。Swift列挙型は、バッキングタイプとして文字列を持つこともできることを考慮してください。2つの文字列を比較すると、の後ろに隠れている1バイトを比較するよりも非常にコストがかかる可能性がありenum
ます。
第三に、列挙型を使用して、一般的に言って、実際には実行したくない浮動小数点数を比較していません。
第4に、列挙型を使用すると、定数の構造体では得られない型安全性が得られます。定数の構造体が行うのは、使用するいくつかの事前定義された定数を定義することだけです。
struct LetterSpacingS {
static let Short = 1.0
static let Medium = 2.0
static let Long = 3.0
}
しかし、これらの値の1つを期待するメソッドはどのように見えるでしょうか?
func setLetterSpacing(spacing: Double) {
// do stuff
}
そして今、Joe-Coderがやって来て何をするか:
foo.setLetterSpacing(-27.861)
彼を止めるものは何もない。それはダブル、どんなダブルでもかかります。これはそれほど一般的ではないかもしれませんが、これが配布しているライブラリにある場合は、「5.0の値を渡すと、まったく正しく表示されません」などの質問やコメントを受け入れることになります。
ただし、これをを使用する場合と比較してくださいenum
。
func setLetterSpacing(spacing: LetterSpacing) {
// do stuff
}
そして今、この引数に何を渡すかについて、3つの事前定義された選択肢しか得られません。
そしてenum
、によって保持される値の内部使用以外では、使用しrawValue
すぎる必要があります。
5番目の理由は、構造体に対して列挙型を使用する強力な理由ではありませんが、ほとんどの場合、列挙型に対して構造体を使用するために提案された理由の1つを排除するためのポイントにすぎません。Swift列挙型は他のタイプにネストでき、他のタイプはSwift列挙型にネストできます。ネストされた型を取得するために構造体を使用する必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加