Swiftでスカラー値のリストを宣言するための最良の方法は何ですか

ニコラスB。

私は疑問に思っていました:シンボルに完全に裏打ちされ、コンパイラーによってチェックされやすいスカラー値の順序付けられていないリストを宣言するための最良の方法は何ですか?

LetterSpacingアクセスしてコードで使用する値のリストをシンボルを介して宣言するとします。

私の理解では、次のenumように迅速に宣言する必要があります。

enum LetterSpacing: Double {
    case Short = 1.0
    case Medium = 2.0
    case Large = 3.0
}

これは正常に機能し、コンパイラチェックを取得しますが、厄介な部分はLetterSpacing.XXX.rawValue、基になる値にアクセスするたびにアクセスする必要があることです。.rawValue私悩ますビットはどこでもこれを指定する必要があります。

struct3で宣言するのは意味がないか不適切だと思い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]

編集
0

コメントを追加

0

関連記事

分類Dev

GWT:カスタムリストボックスを作成するための最良の方法は何ですか

分類Dev

ストリームを渡すための最良の方法は何ですか

分類Dev

Swift 4でUIBezierPathストロークを移動するための最良の方法は何ですか?

分類Dev

UIAutomatorテストでリソース識別子を参照するための最良の方法は何ですか?

分類Dev

Firebase RealtimeDatabaseのリストにデータを追加するための最良の方法は何ですか

分類Dev

Pythonクラスを整理するための最良の方法は何ですか?

分類Dev

mlr:FailureModelをテストするための最良の方法は何ですか?

分類Dev

swiftを使用してカスタムオブジェクトの配列を保存およびロードするための最良の方法は何ですか?

分類Dev

このカスタムレイアウトを作成するための最良の方法は何ですか– IOS?

分類Dev

Swiftでパスワードを暗号化するための最良の方法は何ですか?

分類Dev

クラスで例外をスローするための最良の方法は何ですか?

分類Dev

ImmutableJSで複数のリストを圧縮するための最良の方法は何ですか

分類Dev

NodaTimeベースの値をPostgreSQLに保存するための最良の方法は何ですか?

分類Dev

AWSCDKでパラメータストアの値を消費するための最良の方法は何ですか

分類Dev

現在のPowerShellスクリプトの場所を特定するための最良の方法は何ですか?

分類Dev

外部依存関係を持つクラスをテストするための最良の方法は何ですか

分類Dev

リストから特定の重複要素を削除するための最良の(Pythonic)方法は何ですか?

分類Dev

D3のリストから年齢層を形成するための最良の方法は何ですか?

分類Dev

ビットマップリスト内の画像を比較するための最良の方法は何ですか

分類Dev

Hazelcastでクラス階層をシリアル化するための最良の方法は何ですか?

分類Dev

DRFでカスタムシリアライザーを管理するための最良の方法は何ですか

分類Dev

リスト内の特定の数値に最も近い小さい値と大きい値を見つけるための最良の方法は何ですか

分類Dev

Gradleでタスクをパラメーター化するための最良の方法は何ですか?

分類Dev

クラス静的初期化子をテストするための最良の方法は何ですか?

分類Dev

Kotlinクラスで値を宣言する最良の方法:コンストラクター、本体、またはinit {}

分類Dev

ルビーでネストされた条件を処理するための最良の方法は何ですか?

分類Dev

無料の代数でストリーミングを行うための最良の方法は何ですか?

分類Dev

抽象クラス内のオブジェクトを作成するための最良の方法は何ですか?

分類Dev

Windowsでnode.jsアプリをホストするための最良の方法は何ですか?

Related 関連記事

  1. 1

    GWT:カスタムリストボックスを作成するための最良の方法は何ですか

  2. 2

    ストリームを渡すための最良の方法は何ですか

  3. 3

    Swift 4でUIBezierPathストロークを移動するための最良の方法は何ですか?

  4. 4

    UIAutomatorテストでリソース識別子を参照するための最良の方法は何ですか?

  5. 5

    Firebase RealtimeDatabaseのリストにデータを追加するための最良の方法は何ですか

  6. 6

    Pythonクラスを整理するための最良の方法は何ですか?

  7. 7

    mlr:FailureModelをテストするための最良の方法は何ですか?

  8. 8

    swiftを使用してカスタムオブジェクトの配列を保存およびロードするための最良の方法は何ですか?

  9. 9

    このカスタムレイアウトを作成するための最良の方法は何ですか– IOS?

  10. 10

    Swiftでパスワードを暗号化するための最良の方法は何ですか?

  11. 11

    クラスで例外をスローするための最良の方法は何ですか?

  12. 12

    ImmutableJSで複数のリストを圧縮するための最良の方法は何ですか

  13. 13

    NodaTimeベースの値をPostgreSQLに保存するための最良の方法は何ですか?

  14. 14

    AWSCDKでパラメータストアの値を消費するための最良の方法は何ですか

  15. 15

    現在のPowerShellスクリプトの場所を特定するための最良の方法は何ですか?

  16. 16

    外部依存関係を持つクラスをテストするための最良の方法は何ですか

  17. 17

    リストから特定の重複要素を削除するための最良の(Pythonic)方法は何ですか?

  18. 18

    D3のリストから年齢層を形成するための最良の方法は何ですか?

  19. 19

    ビットマップリスト内の画像を比較するための最良の方法は何ですか

  20. 20

    Hazelcastでクラス階層をシリアル化するための最良の方法は何ですか?

  21. 21

    DRFでカスタムシリアライザーを管理するための最良の方法は何ですか

  22. 22

    リスト内の特定の数値に最も近い小さい値と大きい値を見つけるための最良の方法は何ですか

  23. 23

    Gradleでタスクをパラメーター化するための最良の方法は何ですか?

  24. 24

    クラス静的初期化子をテストするための最良の方法は何ですか?

  25. 25

    Kotlinクラスで値を宣言する最良の方法:コンストラクター、本体、またはinit {}

  26. 26

    ルビーでネストされた条件を処理するための最良の方法は何ですか?

  27. 27

    無料の代数でストリーミングを行うための最良の方法は何ですか?

  28. 28

    抽象クラス内のオブジェクトを作成するための最良の方法は何ですか?

  29. 29

    Windowsでnode.jsアプリをホストするための最良の方法は何ですか?

ホットタグ

アーカイブ