[TIL] 21.03.12.(Fri)


実行内容

  • ジュースメーカープロジェクトStep 1コメンテーターフィードバック関連学習とコード再構築
  • イニシャルRiserを作成カスタムタイプでJSON復号
  • を受信
  • 型実行機能別総括
  • SWIFT基礎文法復習
  • 学習内容


    SWIFT基礎文法復習


    真剣にプロジェクトを実行することも重要ですが、今後私を支える実力が基礎だと思います.だから今日も文法を復習しました.
  • オプション
  • こうがくてきちゅうしゅつ
  • 今日勉強した内容の大部分は悩み/問題と解決方法の部分で説明します。


    厄介な問題


    構造体、クラス、何を書くべきですか?


    構造体とクラスで同じ機能を実現できることを知った瞬間から、どんな場合に何を使うべきか悩み始めた.構造体は拡張と初期実装のプロトコルであり,クラスは継承によって垂直機能を拡張し,既存の機能を上書きすることができ,機能拡張の観点から両選択に欠点はない.構造体は値タイプであり、内部プログラムを変更できないわけではありません.mutatingキーワードをメソッドに追加すると、ストレージ・プロシージャを変更できます.いくつかの違いがあるとすれば、構造体は値タイプであり、クラスは参照タイプの点であり、継承と上書きによって再定義できるかどうか.果たして状況に応じてどのようなものを採用すればよいのでしょうか.今日は価値のある参考資料をいただきました.
    [リンク:構造とクラスから-APple Developerを選択]

    Source - Apple Developer
    以上はリンクの一部です.アップル社は、構造体とクラスを選択する際に以下の4点を考慮することを要求している.
  • は、基本的に構造体
  • を用いる.
  • Objective-Cとの相互運用性が必要な場合は、クラス
  • を使用します.
  • モデリングデータのアイデンティティを制御する必要がある場合は、クラス
  • を使用する.
  • 実施部を共有する場合、プロトコル
  • が構造体に使用する.
    現在のレベルでは、内部プロセスの変更などのタスクを実行する場合は、クラスとして設計する必要があります.構造体でproperty変更をサポートするために,毎日mutatingキーワードを採用する方法を作成し,キーワードによって許されない強制解除の感覚を持つ.これからは変更の余地のあるタイプをレベルにします.
    また、mutatingキーワードでpropertyを変更すると、何が起こるか知りたいです.これはクラスで値を変更するだけと何が違いますか?今日はしばらく勉強しましたが、構造体でmutatingキーワードを用いてpropertyを変更することで、property変更に全く異なるインスタンスが生成されるようですので、さらに理解する必要があります.値タイプと参照タイプなので、メモリ使用率の観点から、他の面もあるかもしれません.ARCのように単語しか聞いたことのない雑誌的なものが入っているので初心者ですが、志はいつも左右に揺れます.良い資料はありませんか...
  • 値に参照でアクセスするとはどういう意味ですか?
  • 解決策


    カスタムタイプにデコード(feat.JSON)


    ジュースメーカープロジェクトでJSONを復号する過程で,Propertyを格納するタイプをカスタムタイプとし,戻ることなくコードストリーム(3.11 TIL)を論理的に組織することが考えられる.しかし、Decodableプロトコルをタイプに適用しても、配分が不十分な問題があり、評論家のLinはinit(from decoder: Decoder)のヒントを与え、長い奮闘を経て、最終的には小さな結果を得た.復号化の過程でJSON内で定義された名称と受信したい名称が異なる場合に使用できるCodingKeyプロトコルとinit(from decoder: Decoder)頭文字登録器で受信するプロトコルタイプを定義して解決できる.
    struct Ingredient: Decodable {
      var fruitName: Fruit?
      var quantity: Int?
      
      private enum CodingKeys: String, CodingKey {
        case fruitName
        case quantity
      }
      
      init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.fruitName = try? container.decode(Fruit.self, forKey: .fruitName)
        self.quantity = try? container.decode(Int.self, forKey: .quantity)
      }
    }
    tryゲートが失敗する可能性があるため、復号コンテンツを受信するプロフェッショナルを傍観者タイプとして指定した.復号化の問題は解決したものの、別の問題が発生…!

    すなわち,上記の出力では,文に異常出力の欠点があるが,intValue: nil文はいったい何を意味するのだろうか.明らかにfoultName propertyはInt値を持たない単純な名前であり、出力結果はFruit(stringValue: "Pineapple", intValue: nil)と同じである.CustomStringConvertibleプロトコルで出力された文をきれいにしました.この部分はさらに考慮する必要があります.