- 1. 【SwiftUI】PhotosPicker使ってみた
- 2. 【Xcode Cloud】Run Build Tool Plug-insを追加すると失敗する
- 3. [Swift] PRをマージした時にSwiftFormatを実行するGithub Actionsを作成する
- 4. [iOS] Localizable.strings からString catarogsに移行する
- 5. React Native入門 プロジェクト作成まで
- 6. 【SwiftUI】iOS16.4以降のsheetを完全に理解する
- 7. 【SwiftUI】モーダル表示の却下
- 8. iOS URLのQueryに使うvalueをパーセントエンコーディングする
- 9. [SwiftUI] sheetを快適に高速開閉するためのハック
- 10. 【Xcode】Xcode内でドキュメントを閲覧する
- 11. iOSの最新情報をキャッチアップする
- 12. Stable Diffusion APIを使って簡単に画像生成アプリを作ってみた
- 13. 【Swift】特定の要素が配列の何番目に入っているかを知りたい
- 14. 【ヨシモト∞ホール×Loupeコラボ企画】GoogleAPIで全国対応した話
- 15. Xcode15でiOS17のSimulatorのインストールに失敗する時の対処法(Failed with HTTP status 400: bad request)
- 16. Swift 配列の宣言と初期化
- 17. 【Swift】FirebaseStorageを使う
- 18. SwiftUIにMetal ShaderでレアカードのホログラムみたいなEffect
- 19. GitHub Actions で Xcode のインクリメンタルビルドを実現する (xcode-cache アクション)
- 20. 【SwiftUI】標準のローディング画面に飽きたのでカスタマイズして作ってみた
【SwiftUI】PhotosPicker使ってみた
# はじめに
PhotosPickerを使ったことがなかったので次回からスムーズに使えるように`PhotosPicker`の最小単位を記録しておきます。# 実装
### 写真を1枚選択する
“`swift
import SwiftUI
import PhotosUIstruct SwiftUIView: View {
@State private var selectedPhoto: PhotosPickerItem?@State private var uiImage: UIImage?
var body: some View {
VStack {
if let uiImage {
Image(uiImage: uiImage)
.resizable()
.scaledToFit()
.padding(20)
【Xcode Cloud】Run Build Tool Plug-insを追加すると失敗する
# はじめに
Xcodeにプラグインを追加したらXcode Cloudが失敗するようになったので解決方法を記録しておきます。# やりかた
① 「ci_scripts」というフォルダを作成します
![スクリーンショット 2023-09-23 19.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8eb31105-1945-14a0-0375-064cc26c935d.png)② 「ci_post_clone.sh」というスクリプトを作成します
![スクリーンショット 2023-09-23 19.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fe87b131-4bf4-851f-fcc6-054be937a0f5.png)③ 「ci_post_clone.sh」を以下のように編集します
“`ci_post_clone.sh
#!/bin/zshdefau
[Swift] PRをマージした時にSwiftFormatを実行するGithub Actionsを作成する
PRがmainにマージされた時にSwiftFormatを実行したら思ったより便利だったので、備忘録として残しておきます。
# 実装
SwiftFormatを実行するためにMintを使用しています。“`yml
name: Formaton:
push:
branches:
– mainjobs:
format:
name: SwiftFormat
runs-on: macos-13
env:
MINT_PATH: mint/lib
MINT_LINK_PATH: mint/bin
steps:
– uses: actions/checkout@v4– name: Select Xcode 15.0
run: sudo xcode-select -s /Applications/Xcode_15.0.app– name: Install mint
run: brew install min
[iOS] Localizable.strings からString catarogsに移行する
# はじめに
`Localizable.strings`使って多言語対応していたものをXcode15から使える`String catarogs`に移行してみました。https://developer.apple.com/documentation/Xcode/localizing-and-varying-text-with-a-string-catalog
# 環境
Xcode 15.0# 内容
まずは既存の`Localizable.strings`を`Migrate to String Catalog`していきます
`Localizable.strings`を選択してMigrate
## はじめに
React Nativeの環境構築の手順や、基礎知識について、メモ代わりに書いていきます。## React Nativeとは
以下の記事から抜粋しました。React Nativeとは、Facebook社が開発したアプリケーションフレームワークでクロスプラットフォームのひとつです。React Nativeを用いることでiOS、Android、Windows、macOSなど、異なるプラットフォームのアプリを同時開発することができます。なお、React Nativeの開発言語にはJavaScriptが用いられています。
Reactは、UIを構築するためのJavaScriptライブラリで、2012年にFacebookのソフトウェア・エンジニアが開発したものになります。社内で開発された後には、Facebook.comやInstagram.com等にも導入されています。
つまり、React NativeはスマホアプリをReactの記法で開発できる、クロスプ
【SwiftUI】iOS16.4以降のsheetを完全に理解する
# はじめに
# 基本実装
本記事で扱うサンプルコードの全コードです。
今後はここから端折っていくので試す方はこちらのコードに追加してください。
“`swift
import SwiftUIstruct Sample1View: View {
@State private var isPresented = false
var body: some View {
Button {
isPresented = true
} label: {
Text(“表示”)
}
.sheet(isPresented: $isPresented) {
Sample2View()
}
}
}struct Sample2View: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button
【SwiftUI】モーダル表示の却下
# この記事は何?
SwiftUIアプリの[シートやポップオーバー表示を取り消す方法](https://developer.apple.com/documentation/swiftui/dismissaction)について、Appleの開発者向けドキュメントを独自に解説する。
> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。# dismissプロパティ
`Dismiss`環境値を使用して、特定の`環境`に対してこの構造体のインスタンスを取得する。
次に、インスタンスを呼び出すと、表示の取り消しを実行する。
インスタンスを呼び出すときにSwiftが呼び出す`callAsFunction()`メソッドを定義するため、インスタンスを直接呼び出す。このアクションを使用して、次のことができる。
–
iOS URLのQueryに使うvalueをパーセントエンコーディングする
# まとめ
URLのQueryのvalue用のCharacterSetを作成して、`addingPercentEncoding`を使ってパーセントエンコーディングを行います。# はじめに
例えば、パーセントエンコーディングしたいクエリを含んだURLを生成したいと思います。
今回はURLComponentsでURLを組み立ててみることにします。
クエリはパーセントエンコーディングしたいので、`addingPercentEncoding`で`urlQueryAllowed`を設定してURLを生成してみました。“`swift
var c = URLComponents()
c.scheme = “https”
c.host = “example.com”
c.path = “/book”
c.query = “title=独習C++”.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)let myUrl: URL = c.url!
print(myUrl) // https://example.com
[SwiftUI] sheetを快適に高速開閉するためのハック
# はじめに
SwiftUIのsheetを閉じるとき、sheetが完全に閉じきるまで、次のsheetを開くことができません。
再度開くには、前のsheetが完全に閉じてからもう一度開くボタンを押す必要があるため、せっかちなユーザーはうんざりするかもしれません。![sheet_before.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875930/f1bf7691-c7e6-e3b1-d8d2-b529870c92ec.gif)
また、タイミングによっては、sheetが自動で無限に開閉を繰り返してしまうというバグも発生するらしいです(そうなったらAppをkillするしかないとか)(手元では再現できず…)
こんな(ニッチな?)問題を解決するためのpropertyWrapperを実装してみました。
# 実際の動作
sheetが完全に閉じる前にOpenボタンを押すと、閉じた瞬間に自動で次のsheetが開きます。![sheet_after.gif](https://qiita-image-sto
【Xcode】Xcode内でドキュメントを閲覧する
# はじめに
今までわからないことがあれば検索からドキュメントに飛んでいましたが、
Xcode15からXcode内でドキュメントがPreviewできるようになったらしいので使ってみました# やりかた
① 右上の5本線を押します
![スクリーンショット 2023-09-21 21.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/569df1c6-bf8e-ebc5-88f6-a4c91726ea91.png)② 「Assistant」を選択します
![スクリーンショット 2023-09-21 21.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a0e35d6e-07df-4a46-f140-b7ec15914465.png)③ 輪っかが2個重なったようなアイコンを選択します
![スクリーンショット 2023-09-21 21.33.41.png](https
iOSの最新情報をキャッチアップする
iOSアプリの開発者は、最新のiOSやXcodeのアップデート状況、アプリの提出要件の変更等に関する情報を日々キャッチアップして対応する必要があります。そこで今回は、私がiOSの最新情報をどの様にキャッチアップしているかについて書きます。
最新技術のキャッチアップというよりは、iOSアプリ開発をする上で必要になる基本的な情報を、どの様に収集しているかについてご紹介します。
iOSアプリ開発を日々行っている方にとっては既知の内容も多いと思いますが、学習を始めたばかりでキャッチアップの方法が分からない方にとって、少しでも参考になればうれしいです。
# よく見ているもの
### 最新ニュース – Apple Developer最新OSのリリースや新機能に関する告知、App Storeへの提出要件の変更、ガイドラインや税金に関する変更等、iOSアプリ開発をする上で知っておかなければならない重要な情報は「最新ニュース」で告知されることが多いです。毎日更新されるものではないですが、定期的にチェックしておく必要があります。
https://developer.apple.com/jp/n
Stable Diffusion APIを使って簡単に画像生成アプリを作ってみた
# はじめに
以前に比べると盛り上がりは感じないかもしれないが、それでもAndroidやiOSストアのランキング上位には画像生成AI系のアプリがいくつも並んでいて、生成系AIにも興味があったので同じようなものが作れないかなと思った。しかし、全部自前で用意するとなると時間もお金もかかりそうなのでまずはAPIとしてそのまま利用できるサービスを探してお試ししてみることに。
# 利用したサービス
Stable Diffusion本家のStability AIでも利用できるAPIは用意されていたが
https://platform.stability.ai/APIや料金体系がわかりやすそうだったりしたので今回はこちらのサービスを利用してみました。
https://stablediffusionapi.com/![price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245797/a80f644b-ab4c-e887-807a-18a8e26acea5.png)
APIを利用できるのはSta
【Swift】特定の要素が配列の何番目に入っているかを知りたい
# はじめに
要素が配列の何番目に出現するかを調べる方法を記事にしておきます# 実装
“`swift
struct XXX {
let id: String
}let array: [XXX] = [XXX(id: “000”), XXX(id: “001”), XXX(id: “002”), XXX(id: “003”), XXX(id: “004”)]
let selectedItem = XXX(id: “003”)
// `firstIndex`を使用することでIndexを調べることができる
if let index = array.firstIndex(where: { $0.id == selectedItem.id }) {
print(“`selectedItem`は配列の\(index)番目の要素です。”)
} else {
print(“`selectedItem`は配列に存在しません。”)
}
“`# おわり
`firstIndex`は覚えておきたいです
【ヨシモト∞ホール×Loupeコラボ企画】GoogleAPIで全国対応した話
## はじめに
株式会社Relicが運営しているLoupeでは、現在ヨシモト∞ホールとのコラボ企画を開催しています!
「オズワルド」や「蛙亭」などヨシモト∞ホールで活躍中の芸人さんたちが、渋谷のオススメスポットを紹介してくれる企画になっているのでご興味がある方はぜひ確認してみてください。https://lp.loupe-app.com/yoshimoto
今回はこの企画を開催するにあたってより多くのユーザーさんに企画を楽しんでもらえるように、Loupeの登録フローに変更を行ったので、その話を書きたいと思います。
※LoupeはiOS/Androidの両OSでサービスを提供していますが、今回の全国対応を実施したのはiOSのみでAndroidは旧仕様のままとなっております。
## UIをどう変えたか
まずは視覚的に取り組み内容を理解してもらいやすいと思うので、UIの変更内容を共有します。
コラボ企画開催前は下記のUIで、1都3県の郵便番号もしくは住所を必須で登録する必要がありましたが、
Xcode15でiOS17のSimulatorのインストールに失敗する時の対処法(Failed with HTTP status 400: bad request)
# 概要
Xcode15のインストール後、iOS17のSimulatorのインストールが求められますが、以下のエラーによりインストールに失敗する事象に遭遇したため、その解決策を残します。`Failed with HTTP status 400: bad request`
# 結論
手動でiOS17 Simulatorをインストールすることで解決出来るようです。# 手順
1. developerサイトより、iOS17 Simulatorをダウンロードします。
developerサイトからダウンロードするか、以下リンクよりダウンロードすることが出来ます。
https://download.developer.apple.com/Developer_Tools/iOS_17_Simulator_Runtime/iOS_17_Simulator_Runtime.dmg
1. iOS_17_Simulator_Runtime.dmgがインストールされたディレクトリで以下を実行します。
`xcrun simctl runtime add iOS_17_Simulator_Runtime
Swift 配列の宣言と初期化
## Swiftで配列を宣言するには、
`Array<要素>`か`[要素]`と書きます。例えば、`Int`型の配列なら`Array
`か`[Int]`です。どちらの書き方でも意味はまったく同じ。
これだけだと、配列`型`の宣言ですから、変数や定数とするためには、これに配列のサイズや要素を指定する必要があります。これには、大きく2通りの書き方があります。一つ目の書き方は、サイズ0(空の)配列を定義して、その後、`append`により、要素を追加していく方法です。(`Array`の[`append`](https://developer.apple.com/documentation/swift/array/append(_:)-1ytnt)は高速です。$O(1)$)
`Int`型の空の配列を定義する書き方として、下記に4つあげましたが、これまた、この4つはどれも同じ意味です。_(a3, a4は型推論)_“`swift:一つ目
var a1: Array= []
var a2: [Int] = []
var a3 = Array()
var a4
【Swift】FirebaseStorageを使う
# はじめに
FirebaseStorageを初めて使ったので、アップロードと削除の基本的な実装を記録しておきます。# アップロード
“`swift
let folderName = “folder”
let imageName = “image”
let storage = Storage.storage()
let storageRef = storage.reference()
let imageRef = storageRef.child(“\(folderName)/\(imageName).jpg”)
imageRef.downloadURL { url, error in
if let error {
print(“error:”, error)
} else if let url {
print(“url:”, url)
}
}
“`# 削除
“`swift
let folderName = “folder”
let imageName = “image”
let storage = Storage.
SwiftUIにMetal ShaderでレアカードのホログラムみたいなEffect
# SwiftUIのViewにMetal Shaderを使ってレアカードのホログラムみたいなEffectをかけてみた
iOS17からSwiftUIにMetalのShaderを使ってEffectをかける機能が追加されました
[colorEffect](https://developer.apple.com/documentation/swiftui/view/coloreffect(_:isenabled:))、[distortionEffect](https://developer.apple.com/documentation/swiftui/view/distortioneffect(_:maxsampleoffset:isenabled:))、[layerEffect](https://developer.apple.com/documentation/swiftui/view/layereffect(_:maxsampleoffset:isenabled:))の3つのmodifierです
今回は、colorEffectを使って、TCGのレアカードのホログラムみたいなEffec
GitHub Actions で Xcode のインクリメンタルビルドを実現する (xcode-cache アクション)
GitHub Actions で iOS アプリをビルドするときの Xcode のインクリメンタルビルドを有効にするためのキャッシュ設定について解説します。
CI でのビルドで Xcode のインクリメンタルビルドが使えるようになれば、毎回 CI 上でフルビルドし40分程度かかっていたプロジェクトが、差分のみのビルドでビルド時間が5分に短縮されたりすることが期待できます。
# 環境
この記事では、以下の環境で調査・検証した結果を記載しています。
* ローカル環境
* macOS Ventura 13.5.1
* Xcode 14.3.1 (14E300c)
* APFS (Encrypted / Case Insentive)
* GitHub Actions 環境
* macos-latest
* macOS Monterey 12.6.8
* Xcode 14.2.0 (14C18)# 結論
結論としては xcode-cache Action の使用がおすすめです。
この記事後半で解説する Xcode
【SwiftUI】標準のローディング画面に飽きたのでカスタマイズして作ってみた
# はじめに
ローディング画面をカスタムして作ってみました# 完成形
![Simulator Screen Recording – iPhone 14 Pro – 2023-09-18 at 20.31.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e53df28f-c5b7-c2a5-caf7-2c481b414c5f.gif)# 実装
“`swiftimport SwiftUI
struct CircularLoadingIndicator: View {
@State private var scale: CGFloat = 0.25
private let numberOfCircles = 12
private let circleSize: CGFloat = 10
private let animationDuration: Double = 0.8
var body: some View {
G