- 1. [SwiftUI] sheetを快適に高速開閉するためのハック
- 2. 【Xcode】Xcode内でドキュメントを閲覧する
- 3. iOSの最新情報をキャッチアップする
- 4. Stable Diffusion APIを使って簡単に画像生成アプリを作ってみた
- 5. 【Swift】特定の要素が配列の何番目に入っているかを知りたい
- 6. 【ヨシモト∞ホール×Loupeコラボ企画】GoogleAPIで全国対応した話
- 7. Xcode15でiOS17のSimulatorのインストールに失敗する時の対処法(Failed with HTTP status 400: bad request)
- 8. Swift 配列の宣言と初期化
- 9. 【Swift】FirebaseStorageを使う
- 10. SwiftUIにMetal ShaderでレアカードのホログラムみたいなEffect
- 11. GitHub Actions で Xcode のインクリメンタルビルドを実現する (xcode-cache アクション)
- 12. 【SwiftUI】標準のローディング画面に飽きたのでカスタマイズして作ってみた
- 13. printしないエラーハンドリング
- 14. 【Swift】classとstructの違いを理解していなかったので整理してみた
- 15. 指定した時間で閉じるアラートの後に処理を実行する
- 16. [Xcode] テストをforやwhileを使わずに複数回実行する方法
- 17. 【Swift】TCAでモーダル遷移時に値を渡す
- 18. os.Loggerの説明と使い方(Swift)
- 19. 【個人開発】【iOS】目標達成をサポートするアプリ「DrawGoal」をリリースしました!
- 20. Upcoming Feature Flagsの一覧を確認する方法(Swift)
[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
printしないエラーハンドリング
# 記事を書くモチベーション
* **<実現したかったこと>エラーが起きた時にユーザーにエラーの内容に応じたアラートを表示する。**
* エラーハンドリングについて調べると、printでエラーを出力して処理したり、カスタムエラーを投げている記事がたくさんありました。
* しかし、私は個人開発で、なるべく標準ライブラリのエラーを利用したかった。
* ようやく期待する動作をする書き方を見つけたのでそれを書いてみます。# サンプルコードの概要
* QiitaAPIを叩いて、返ってきたレスポンスをデコードして画面に作成日とユーザー名を表示します。
* このサンプルでエラーが発生するのは、APIにセッションしている時とデコードするときです。
* 期待する動作は、エラー発生時に、内容に応じたアラートをユーザーに表示することです。# 結論
説明の前に先にコードの全体を示します。以下のコードをそのままプロジェクトに貼りつけると動くと思います。。。
“`swift:ContentView.swift
import SwiftUIstruct Item: Decodable {
le
【Swift】classとstructの違いを理解していなかったので整理してみた
# はじめに
いままでclassとstructの違いをしっかり調べたことがなかったのでまとめてみました# 違い1(初期化)
### class
`class`はイニシャライザが必須です。
ないと怒られます
“`swift
class PersonClass {
var name: Stringinit(name: String) {
self.name = name
}
}
“`
![スクリーンショット 2023-09-17 19.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6420c90a-2d00-8244-ddf0-10759c881dc5.png)### struct
`struct`は自動初期化されるらしく、イニシャライザはなくても怒られません。
もちろんあっても良いです
“`swift
struct PersonStruct {
var name: String
}
“`# 違い2(
指定した時間で閉じるアラートの後に処理を実行する
## 概要
アラートを表示した後指定した時間で閉じ、さらにその後処理を実行する方法です。
今回は閉じるボタンをつけていないですが、必要に応じてaddActionを使ってボタンを追加します。## コード
### 1. アラートを表示するメソッドを作成する
“`Swift
func showAutoDismissAlert(title: String, message: String, completion: (() -> Void)?) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
present(alert, animated: true)DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
alert.dismiss(animated: true) {
// アラートが閉じられた後にコードを実行
[Xcode] テストをforやwhileを使わずに複数回実行する方法
asyncなテストを実装した際、複数回実行するとまれに失敗することがあります。信頼性を向上させるためにテストを複数回実行してもテストが失敗しないことを確認する必要があります。
そこで今回はテストをfor文を使わずに何回も繰り返す方法を発見したので紹介します。# 方法
複数回実行したいテストのここを右クリックします。![スクリーンショット 2023-09-17 3.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/eb31a193-2874-c496-eca2-2baf90f7b704.png)
次に、Run “<テスト名>” Repeatedly…をクリックします。
![スクリーンショット 2023-09-17 3.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/47cfeeaa-88a2-6bce-1c91-67a80ecfad79.png)すると、こ
【Swift】TCAでモーダル遷移時に値を渡す
# はじめに
TCAでモーダル遷移時にSubViewに値を渡す方法を記録しておきます。
間違っている箇所やもっと良い方法がある箇所があるかもしれません。
もしあればコメントで教えていただけると助かります。# やりたいこと
![Simulator Screen Recording – iPhone 14 Pro – 2023-09-16 at 20.55.40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/49d9fc5f-d7b5-3288-319a-151909e0086f.gif)# 実装
`ContentView`から`SubView`に遷移させます。### ContentView
“`ContentView.swift
import SwiftUIstruct ContentView: View {
@ObservedObject private var viewStore: ViewStoreOfle
os.Loggerの説明と使い方(Swift)
## はじめに
`os.Logger` とは、iOS 14.0+から使えるロギングのAPIです。
https://developer.apple.com/documentation/os/logger
`print(_:)` よりもログに特化していて便利なので、使い方などを紹介します。
## 環境
– OS: macOS Ventura 13.5.2
– Swift: 5.9
– Xcode: 15.0 (15A240d)## ロガーのインスタンス生成
まずは `os.Logger` のインスタンスを生成します。
毎回サブシステムやカテゴリを指定するのが手間なので、私は簡単なラッパーを作成して使っています。
“`swift:Logger.swift
import Foundation
import ospublic enum Logger {
public static let standard: os.Logger = .init(
subsystem: Bundle.main.bundleIdentifier!,
c
【個人開発】【iOS】目標達成をサポートするアプリ「DrawGoal」をリリースしました!
# 前置き
こんにちは、個人開発が趣味のりょうやです。
最近開発した「DrawGoal」というアプリを紹介します。https://apps.apple.com/us/app/drawgoal-%E7%9B%AE%E6%A8%99%E9%81%94%E6%88%90%E6%94%AF%E6%8F%B4%E3%82%A2%E3%83%97%E3%83%AA/id6451417773
# どんなアプリか
「DrawGoal」は目標達成をサポートするアプリケーションです。自らの目標を設定し、その達成に向けての日々の進捗を記録することができます。シンプルな操作性で、誰でも簡単に利用することができます。特に、目標を持っているものの、その達成に向けての具体的なアクションや進捗の管理が難しいと感じている人にとって、非常に役立つツールになると思っています。
# 何故このアプリを開発したか
多くの人は、物事を進める際に目標を立てて行動します。しかし、目標に向かって進む途中での進捗をきちんと記録する人は少ないのではないでしょうか。私も計画的に物事を進めるのは得意ではなく、ついつい突っ走ってしまう
Upcoming Feature Flagsの一覧を確認する方法(Swift)
## はじめに
Swift 5.8から「Upcoming Feature Flags」というフラグが追加されました。
Swiftの言語仕様において、まれにソースの互換性を壊す変更が採用されることがあります。
そのような破壊的変更はメジャーバージョンアップまで導入されませんが、Upcoming Feature FlagsをONにすることで早めに有効にできます。今後の機能を予め有効にすることで、メジャーバージョンアップ時の移行が容易になるなどのメリットがあります。
詳細は以下の記事をご参照ください。
https://www.swift.org/blog/using-upcoming-feature-flags/
ただどのようなUpcoming Feature Flagがあるかがわかりづらいので、一覧で確認する方法を紹介します。
## 環境
– OS: macOS Ventura 13.5.2
– Swift: 5.9
– Xcode: 15.0 (15A240d)
– swift-tools-version: 5.9## Upcoming Feature Flagsの