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

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

React Native入門 プロジェクト作成まで

## はじめに
React Nativeの環境構築の手順や、基礎知識について、メモ代わりに書いていきます。

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

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

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)

すると、こ

元記事を表示

OTHERカテゴリの最新記事