Amarronの日記

iOSやMac、Web系の記事を書きます。

Swift5 SwfitUI

概要

  • Swift5とSwiftUIを調べたので、参考にした使用や感想、調べた内容などを備忘録的に残します。
  • Swift2までの知識はあるので、変更点や個人的な印象期な内容を記載します。(今の仕事ではあまりSwiftを使っていないです。)
  • 動機としては、個人でアプリを久しぶり作りたくなったので、学習も踏まえ調べました。

参考資料

swift:swiftの復習用
swift5:swift5の学習用
swift ui:swfit uiの学習用

目次

  1. 感想
  2. swift
  3. swift5
  4. swift ui

1. 感想

  • Swift
    • リッチな機能が増えていてびっくり
    • 型が省略されすぎて、頭の中で整理するのがなれるまでは大変そう(洗練されているから?)
  • Swift5
    • ABIが良さそう(今後のメンテナンスコストが少なくなりそう)
    • Swift5_Cheet_Sheet.pdfが、標準ライブラリの更新を重点的に整理させれていて助かる
  • SwiftUI
    • SwiftUIで用意されていない画面の挙動を実装するのが大変そう(クラアンとの要求に絶対に答えるみたいな開発ではどこかで破綻しそうな気がする)
    • 結構ボリュームがある
    • チュートリアルがかなり充実している。(サンプルコードもあって親切)
    • xibとプログラムが一致していて嬉しい
    • 実装結果がリアルタイムに反映されるPreview画面(エミュレータみたいのが常に表示されていて、修正が即座に反映されるの)は、かなり作業が捗る
      • なぜか新しいクラスを作ったあとはpreviewコンパイルエラーになることが多かった(その都度クリーンビルドやXcodeの再起動などを行った)
    • プログラムが今までと結構違うので、コーディングが最初は戸惑いそう
      • ViewControllerとかもう作らない?
      • UIViewのbodyに各Viewを追加していく?
      • セルはTableViewCellを継承してつくるのではなく、bodyの中身をCellにする感じっぽい
    • 書き方はSwiftUIのほうがエレガント(直感的で無駄が少なくて)で良い
      • サイズを指定するときに費用な項目だけ設定できるとか
      • Viewが、ブロックを組み合わせるようなモジュール感があって汎用的に作りやすそう
    • SwiftUI Essentialsだけ実際に書きながら試す(Drawing and Animation、App Design and Layout、Framework Integrationはどんなことができるのか眺める)
      • アイコンのような複雑な図形やグラフ、アニメーション、横スクロールのリスト、オーバーレイ的な画面表示

2. swift

A Swift Tour

英語が辛いのでThe Swift Programming Language 日本語訳を利用。
playgroundでめぼしいところを実践してみる。 プログラムを書く時に、再度Swift ツアーを確認すると良さそう。(最初から全部完璧に覚えるのは大変なので、ざっくり何が書いてあるかだけ覚える)
「2. 言語ガイド」は量が多いので、「2. 1. 基本」だけ見て、それ以降は興味がある箇所を読む。 以下、印象に残ったところ。

    1. Swift にようこそ
        1. Swift ツアー
      1. 1.2.3. 関数とクロージャ
      2. 1.2.4. オブジェクトとクラス
        • set,get
        • willSet,didSet
      3. 1.2.5. 列挙型と構造体
        • enumは定数用、structは構造
          • struct:人間
        • 1.2.6. プロトコルとエクステンション
          • extention
            • Int型とかでも拡張できる
        • 1.2.7. エラー処理
          • defer
            • 関数がリターンする前に常に実行されるコードブロックを記述する
        • 1.2.8. ジェネリクス
          • Equatable
            • Object同士の比較
      1. 言語ガイド
      2. 2.1.9. タイプエイリアス
        • typealias
          • タイプエイリアスは、既存の型に別の名前を定義すること
      3. 2.1.11. タプル
        • タプルは、複数の値を 1 つの複合値にグループ化します

3. swift 5

Swift 5の導入
Swift 5では、Appの配信が劇的に改善されます。SwiftランタイムがiOS、macOS、tvOS、watchOSに組み込まれるようになったため、最新のOSリリースではランタイムライブラリをAppにバンドルする必要がなくなります。Swiftで作成したAppをユーザーがApp Storeからダウンロードすると、従来よりも小さいサイズのAppがより速くダウンロードされます。
その他の機能
String型がUTF-8エンコーディングで再実装されたため、より高速なコードの実行が期待できます。
デバッグ用ビルドとリリース用ビルドの両方で、メモリへの排他アクセスがデフォルトで必須になりました。
SIMD VectorおよびResult型が標準ライブラリに追加されました。
DictionaryとSetのパフォーマンスが改善されました。
動的に呼び出し可能な型をサポートするようになり、Python、JavaScript、Rubyといった動的言語との相互運用性が強化されました。

https://developer.apple.com/jp/swift/
  1. Swift.org - Swift 5 Released!を読む。
  2. 言語の更新
    • 安定したABIとバイナリの互換性
      • ABIの安定性など
      • ABI安定後のAppleプラットフォームでのSwiftの進化
    • 標準ライブラリの更新
      • Swift 5は、Swift Evolutionプロセスからの次の標準ライブラリの提案を実装しています。
        • SE-0200 未加工テキストをサポートするための文字列リテラル区切り文字の強化
        • SE-0211 UnicodeプロパティをUnicode.Scalarに追加
        • SE-0214 DictionaryLiteralタイプの名前をKeyValuePairsに変更
        • SE-0215 Never型がEquatableとHashable型に準拠した
        • SE-0218 compactMapValuesにdictionary型を導入
        • SE-0221 キャラクタープロパティ
        • SE-0225 isMultipleをBinaryIntegerに追加
        • SE-0228 ExpressibleByStringInterpolationを修正
        • SE-0229 SIMD Vectors
        • SE-0232 標準ライブラリのコレクション階層からいくつかのカスタマイズポイントを削除します
        • SE-0233 数値に新しいAdditiveArithmeticプロトコルを洗練させる
        • SE-0234 Sequence.SubSequenceを削除
        • SE-0235 標準ライブラリにResult型を追加
        • SE-0237 withContiguous {Mutable} StorageIfAvailableメソッドの導入
        • SE-0239 Range関連をCotableプロトコルに準拠した
        • SE-0241 文字列インデックスのエンコードオフセットを非推奨
    • 追加の言語およびコンパイラの更新
      • Swift 5はデフォルトで、デバッグビルドとリリースビルドの両方でメモリへの排他的アクセスを強制します。
      • また、Swift 5は、PythonJavaScriptRubyなどの動的言語との相互運用性を向上させる動的呼び出し可能型をサポートしています。
      • Swift 5は、Swift Evolutionプロセスからの次の言語提案も実装しています。
        • SE-0192 将来の列挙型ケースの処理
        • SE-0213 強制によるリテラル初期化 -
SE-0216 ユーザー定義の動的に「呼び出し可能な」型を導入
        • SE-0224 コンパイル条件で「小なり」演算子をサポート -
SE-0227 IDキーパス -
SE-0230「try?」の結果としてネストされたオプションをフラット化します
    • パッケージマネージャーの更新
      • Swift Package Managerには、依存関係ミラーリング、ターゲット固有のビルド設定、カスタマイズされた展開ターゲット、コードカバレッジデータを生成する機能など、Swift 5の多くの新機能が含まれています。
      • さらに、このswift runコマンドには、実行可能ファイルをビルドする必要なく、REPLにライブラリをインポートする機能が含まれています。
      • Swift 5は、Swift Evolutionプロセスからの次のパッケージマネージャーの提案を実装しています。
        • SE-0219 パッケージマネージャーの依存関係のミラーリング
        • SE-0236 パッケージマネージャープラットフォームの展開設定 -
SE-0238 パッケージマネージャーターゲット固有のビルド設定
  3. Swift5_Cheet_Sheet.pdfを読む。 -「Swift.org - Swift 5 Released!」の内容がわかりやすく説明されている
  4. What's New in Swiftを見る。

4. swift ui

  • 環境構築
    • iOS15
    • Xcode11
  • SwiftUI Tutorialsを進める。
    • SwiftUI Essentials
      • Creating and Combining Views
      • Building Lists and Navigation
      • Handling User Input
    • Drawing and Animation
      • Drawing Paths and Shapes
      • Animating Views and Transitions
    • App Design and Layout
      • Composing Complex Interfaces
      • Working with UI Controls
    • Framework Integration
      • Interfacing with UIKit
  • Note
    • VStack/HStack・・・画面部品を縦並び、横並びに整理して表示する
    • UIViewRepresentable
      • makeUIView(context:)・・・ビューオブジェクトを作成し、その初期状態を構成します。
      • updateUIView(_ :context:)・・・・指定されたビューの状態をSwiftUIからの新しい情報で更新します。
    • TableView
      • NavigationView // TableView
        • List(dataList, id: .id) { data in // Cell
          • NavigationLink(destination: DetailView()) { // IBAction
            • DetailView(data: data)
    • Data
      • @Published・・・プロパティの値変更を通知する属性マーク
      • @EnvironmentObject・・・修飾子が親に適用されている限り、自動的に値を取得する
// TableViewの例
struct LandmarkList: View {
    var body: some View {
        NavigationView { // TableView
            List(landmarkData, id: \.id) { landmark in // Cell
                NavigationLink(destination: LandmarkDetail()) { // IBAction
                    LandmarkRow(landmark: landmark)
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

SwiftUI Essentials

ContentView.swift
import SwiftUI

/*
 デフォルトでは、SwiftUIビューファイルは2つの構造を宣言します。
 最初の構造はViewプロトコルに準拠し、ビューのコンテンツとレイアウトを記述します。
 2番目の構造は、そのビューのプレビューを宣言します。
 */
struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

struct ContentView_Preview: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}