26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初めての Swift Package ライブラリーハンズオン

Last updated at Posted at 2022-03-19

本記事は技育祭2022春の勉強会セッションで行われるハンズオンのための資料です。

前提条件

  • Xcode がインストールされています
  • GitHub(GitLab 等でも可)のアカウントを持っています
  • 上記アカウントへのプッシュ可能なローカル環境が構築されています

ゴール

  • おみくじを引くライブラリーを作り、Swift Package として GitHub で配布します

    スクリーンショット 2022-03-18 2.08.46.png

  • 配布したライブラリーが正しく動作できるか、検証アプリで動作確認します

    スクリーンショット 2022-03-18 2.05.36.png

下準備

  1. ライブラリー名を決めます

    例:Omikuji

  2. ライブラリーの置き場を決めます

    例:~/Documents/Omikuji(=/Users/MyAccount/Documents/Omikuji

Swift Package を作成

  1. Xcode を開き、新規プロジェクトを作ります

    スクリーンショット 2022-03-17 1.18.56.png

  2. Multiplatform タブから Swift Package プロジェクトを選び、次に進みます

    スクリーンショット 2022-03-17 1.19.30.png

  3. 先ほど決めた置き場とライブラリー名で保存し、Create Git repository on my Mac オプションにチェックを入れます

    スクリーンショット 2022-03-17 1.26.42.png

  4. もし git の GUI クライアント(例:SourceTree や Fork)を利用しているなら、該当パスをクライアントに追加します(しなくてもターミナルから git 使えるので問題ありません、好みに応じて使い分けてください)

    スクリーンショット 2022-03-17 1.28.09.png

  5. 初期状態で作られたものを確認します

    Xcode に戻ると、Omikuji/Sources/Omikuji/Omikuji.swift というファイルがあるので、それをクリックすると初期状態で下記のようなコードがすでに書かれていることが確認できます:

    Omikuji.swift
    public struct Omikuji {
        public private(set) var text = "Hello, World!"
    
        public init() {
        }
    }
    

軽い動作確認

  1. 複数の Xcode で同じプロジェクトを開けないため、一旦ライブラリーを開いてる Xcode を閉じます

  2. ライブラリーを利用するアプリプロジェクトを作成します

    Xcode で新規 Multiplatform App プロジェクトを、ライブラリーの親フォルダーに作成します
    例:~/Documents/OmikujiApp
    スクリーンショット 2022-03-18 1.11.18.png

  3. プロジェクト設定の Package Dependencies タブから、先ほど作ったライブラリーをローカルパスで追加します

    スクリーンショット 2022-03-18 1.11.50.png

  4. iOS もしくは macOS アプリターゲット(動作確認したいターゲットで OK です;両方入れても可)設定の General タブから、先ほど作ったライブラリーを Frameworks, Libraries, and Embedded Content に追加

    スクリーンショット 2022-03-18 1.13.08.png

  5. Shared の ContentView.swift を開いて、ライブラリーの出力を確認します

    先頭に import Omikuji を追加し、Text("Hello, world!") の部分を Text(Omikuji().text) で置き換え、プレビュー画面が Hello, World! に変わったかどうか(小文字の w から大文字の W に変わったかどうか)を確認します

    ContentView.swift
    import SwiftUI
    +import Omikuji
    
    struct ContentView: View {
        var body: some View {
    -        Text("Hello, world")
    +        Text(Omikuji().text)
                .padding()
        }
    }
    

    スクリーンショット 2022-03-18 1.17.41.png

ライブラリーの機能を実装

  1. 動作確認アプリから直接 Omikuji パッケージの編集ができるので、そのまま Packages/Omikuji/Sources/Omikuji を開きます

  2. せっかく Swift は日本語プログラミングに対応しているので、日本語で実装しようと思います。というわけで既存の Omikuji.swift を削除し、新たに おみくじ.swift ファイルを作ります

    スクリーンショット 2022-03-18 1.22.47.png

  3. おみくじですので、大吉 中吉 小吉 末吉 大凶enum を作ります

    ライブラリー外のモジュール、すなわち検証アプリやライブラリーを利用するアプリで利用するので、public で作る必要があります

    おみくじ.swift
    public enum おみくじ {
        case 大吉
        case 中吉
        case 小吉
        case 
        case 末吉
        case 
        case 大凶
    }
    
  4. おみくじを引きたいので、引く() という静的メソッドを作ります

    Swift には全ての case を配列で羅列してくれるためのプロトコル CaseIterable と、配列からランダムな要素を取り出すためのメソッド randomElement() があるので、これらを活用して実装します

    おみくじ.swift
    -public enum おみくじ {
    +public enum おみくじ: CaseIterable {
        case 大吉
        case 中吉
        case 小吉
        case 
        case 末吉
        case 
        case 大凶
    }
    +
    +extension おみくじ {
    +
    +    public static func 引く() -> Self {
    +        allCases.randomElement()!
    +    }
    +
    +}
    
  5. 画面で引いた結果を表示したいので、おみくじString として、CustomStringConvertible に適合します

    おみくじ.swift
    -public enum おみくじ: CaseIterable {
    +public enum おみくじ: String, CaseIterable {
        // ...
    }
    // ...
    +extension おみくじ: CustomStringConvertible {
    +
    +    public var description: String {
    +        rawValue
    +    }
    +
    +}
    
  6. 検証アプリの ContentView.swift に戻り、今の実装を確認してみます

    Text の内容を おみくじ.引く().description で置き換えれば OK です

    ContentView.swift
    struct ContentView: View {
        var body: some View {
    -        Text(Omikuji().text)
    +        Text(おみくじ.引く().description)
                .padding()
        }
    }
    

    スクリーンショット 2022-03-18 1.43.41.png

  7. 動作が無事確認できたら git にコミットします

    ターミナルから直接使っている場合は

    % git add .
    % git commit -m "初コミット"
    

    のように全ての差分をステージングし、初コミットなどのコミットメッセージでコミットすれば OK です。コミットメッセージの内容は自由です。
    また SourceTree や Fork を使っている場合は、それらのツールの使い方に従って全ての差分をコミットします。

OSS として公開

  1. GitHub(もしくは GitLab とかでも問題ありません)で新しい空リポジトリーを作成します

    例: https://github.com/my-account/omikuji

  2. 作られたリモートリポジトリーをローカルの git リポジトリーに設定します

    ターミナルから git を利用している場合は

    % git remote add origin https://github.com/my-account/omikuji
    

    SourceTree などの GUI アプリの場合はアプリの使い方に従って設定します

  3. リポジトリーを GitHub に Push します

    ターミナルから git を利用している場合は

    % git push --set-upstream origin main
    

    SourceTree などの GUI アプリの場合はアプリの使い方に従って設定します

  4. GitHub から最新の main ブランチをリリースします

    リリースバージョンはセマンティックバージョニングをお勧めします。それに従うと今回は初期開発リリースとしてバージョン 0.1.0 でリリースします。この際のタグは v0.1.0 とします
    スクリーンショット 2022-03-18 1.55.39.png

  5. 【オプショナル】SNS とかで自分が作ったライブラリーを宣伝します

    そりゃあみんなに使ってほしいですよね!?

作られたライブラリーを実際に利用

  1. 上に作った動作確認用のプロジェクトを開き、確認のためのローカルライブラリーの設定を削除

    プロジェクト配下の Packages を丸ごと削除(元のデータを消したいわけではないので、Remove Reference で削除します)
    スクリーンショット 2022-03-18 1.59.42.png

  2. 再びプロジェクト設定の Package Dependencies タブから、公開 URL を入れてライブラリーを導入します

    スクリーンショット 2022-03-18 2.03.04.png

  3. もう一回 ContentView.swift を開いて動作確認します

    この際プレビューで表示されているおみくじの結果がおそらく変わります。もし変わらなかったら何回か別のファイルに切り替えてまた ContentView.swift ファイルに戻ってみてください。その度にプレビューが再生成され、新しいおみくじ結果が表示されるはずです
    スクリーンショット 2022-03-18 2.05.36.png

以上

これであなたも自分の Swift Package ライブラリーの配布ができるようになりました!

また、今後は更に README.md を充実させてみるなどで、より人に使ってもらいやすいライブラリーに仕上げてみてもいいと思いますよ!

早くできた人へ

既にある程度の Swift 経験がある人なら今回のハンズオンはとてもスムーズに早くできちゃったかもしれません。というわけでそんなあなたに、とっておきな追加課題を出しましょう。実施は任意です。

  1. 今回のおみくじは完全にランダムであり、(乱数アルゴリズムのばらつきを無視すれば)どの結果でも同じ確率が出てきます。ところが実際に神社やお寺で引いたおみくじは(場所にもよりますが)いい結果が出る確率が高いです。この 引く メソッドもそうなるように調整してみましょう。

  2. いい結果が出なかった人が、次にもう一回引きたいと思う人もいます。そんな時にもし同じ結果が出てしまうとちょっとゲンナリしますよね。そんなわがままな人のために、前回とは必ず違う結果が出る 再度引く メソッドを作ってみましょう。その時、前回と違う結果を回避するためにどんな方法があるか(例えば前回の結果を引数からもらうか、それとも 引く メソッドと同じく引数なしでどうにかするか;そして前回の結果を知った上でそれをどのように回避するかなど)も自由に考えて、それぞれのアプローチのメリットデメリットも考えてみましょう。

  3. 上記のブラッシュアップをリリースしてみましょう。その時、本記事にも既に出てた「セマンティックバージョニング」でバージョン番号を付ける際にはどのバージョンにすべきかも考えておきましょう。そしてリリースノートも忘れずに書いておきましょう。

26
15
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?