iOS関連のことを調べてみた2023年09月21日

iOS関連のことを調べてみた2023年09月21日

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県の郵便番号もしくは住所を必須で登録する必要がありましたが、

IMG_2292.PNG (200.9 k</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Google</div>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>API</div>
<div class='tag-cloud-link'>GoogleMapsAPI</div>
<div class='tag-cloud-link'>Swift</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/OKMTT/items/4b9d07ce1090fa20e07d'>元記事を表示</a></div>
<h3 id=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)

# 実装
“`swift

import 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 SwiftUI

struct Item: Decodable {
le

元記事を表示

【Swift】classとstructの違いを理解していなかったので整理してみた

# はじめに
いままでclassとstructの違いをしっかり調べたことがなかったのでまとめてみました

# 違い1(初期化)
### class
`class`はイニシャライザが必須です。
ないと怒られます
“`swift
class PersonClass {
var name: String

init(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 SwiftUI

struct ContentView: View {
@ObservedObject private var viewStore: ViewStoreOf

le

元記事を表示

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 os

public 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の

元記事を表示

SwiftUIレイアウトでImageを作成する

所謂スクリーンショット

前回の「[SwiftUIレイアウトで複数ページのPDFを作成する](https://qiita.com/mbotsu/items/eea0f350bc1b041e3b3b)」応用でSwiftUIのViewをイメージにして保存。
例の[ImageRenderer](https://developer.apple.com/documentation/swiftui/imagerenderer)で表示できないGridやListもちゃんと表示できています。

ついでにiOS16の[Charts](https://developer.apple.com/documentation/charts)を少し弄ってみた。

– chartXScaleでグラフの表示範囲を指定、ここでは20〜30の範囲だけ表示
– PointMarkの表示をoverlayして画像を表示
– BarMark同士を重ねて帯の表示

ユースケースとしては、健康診断なんかで使うグラフのような使い方ができるわけです。

【TCA】@BindingStateを使って値を監視する

# はじめに
@BindingStateの使い方を記録しておきます

# 完成
![画面収録-2023-09-15-19.59.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/920c9395-67a6-67f5-da04-c8a74c04e617.gif)

# 実装
### Reducer
“`diff_swift
import Foundation
import ComposableArchitecture

public struct SampleReducer: Reducer {
public init() {}

// MARK: – State
public struct State: Equatable {
+ @BindingState var text = “” // @BindingStateを付与

public init() {}
}

// MARK: – Action

元記事を表示

【Swift】DataSourceでParchmentを実装する方法

## はじめに
ページャーを実装する必要があり、自分で作るのはめんどくさかったので、いいライブラリないかなと思い調べたところ“Parchment“というライブラリを見つけたので実装方法をメモします。

## 前提条件
Parchmentライブラリがインストールされていること

## 実装方法

### 完成イメージ
今回は、画面全体にページャーを実装するのではなく、表示させたい範囲に実装しています。
![Simulator Screen Recording – iPhone 14 Pro – 2023-09-15 at 10.39.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/1a93fb42-2e5c-a1a1-67a3-7e098310a9d5.gif)

### 手順1
まず初めに表示したい**View**と**ViewController**のセットをそれぞれ作成します。
![スクリーンショット 2023-09-15 10.52.03.png](https://qii

元記事を表示

OTHERカテゴリの最新記事