iOS関連のことを調べてみた

iOS関連のことを調べてみた

【Swift】Firestoreのエラーをローカライズする

# はじめに
Firestoreは便利ですが、SDKで定義されているエラーのerrorDescriptionは英語でそのまま使うとユーザーにとってわかりにくいものになってしまいます。
そこでFirestoreのエラーを自前でローカライズしてみようという記事です。

# 実装
StringCatalogを使うために`String(localized:)`で実装しています
“`swift
import FirebaseFirestore
import FirebaseFirestoreSwift
import Foundation

public enum PostError: Error, LocalizedError {
case firestore(FirestoreErrorCode.Code)

public var errorDescription: String? {
switch self {

case .firestore(.OK):
return String(localized

元記事を表示

YouTuberはじめてみました

## YouTuberはじめてみました

先日、岸川さん、松舘さん達iOSデベロッパーとの飲み会で、どういう経緯でそうなったか思い出せませんが、「吉川さんなんか動画やってよ」みたいな話が出てきて、そういえば以前から YouTuberやるなら是非やってみたいと思った企画があったのを思い出しました。

それは、アプリをゼロから開発制作する過程を動画化してみる事です。なんか浦沢直樹の「漫勉」みたいですね。自分は浦沢直樹ほどの大御所ではありませんが、iOS開発者界隈では、まぁまぁのプレゼンスはあるかなと自負しております。

で、ここ何日かほぼ毎日XcodeとSwiftでのアプリ開発過程を深夜、ぶつぶつ独り言をつぶやきながら、アプリの開発を録画してきました。動画時間が長いので、実時間以上の時間を掛けて編集している余裕はないのと、セミライブ感を出すために、ほぼそのままYouTubeに公開していますが、ストックができるまでステルスでアップロードしていました。

ある程度ストックが貯まってきた事から、今回Qiitaの記事として発表する事にしました。動画のプレイリストは以下の通りです。

https:/

元記事を表示

SwiftUIでダイアログ

今回はSwiftUIでダイアログを表示する話。
様々なダイアログを表示してモデルのプロパティを変更できる機構を考えます。

開発アプリPR

3分作曲-musicLine-

# はじめに

モデルのプロパティを

元記事を表示

TCAでGithubリポジトリ検索アプリを作ってみよう①

# はじめに
TCAは注目度は高いと思っていますが、僕の(狭い)観測範囲では導入事例はまだあまり多くない印象です。

僕が関わっているプロダクトではガッツリTCAを使っているので、国内でもっともっとTCAが盛り上がってくれないと困る…!w

ということで、国内でのTCAの盛り上がりに少しでも貢献できればと思い、実践的なサンプルアプリケーションを作って解説記事を書いてみることにしました。

ちゃんと解説しようと思うと結構なボリュームになりそうなので、いくつかの記事に分けて公開していく予定です。

# 想定読者
TCAを全く知らない方向けの記事ではありません。
少なくとも[公式チュートリアル](https://pointfreeco.github.io/swift-composable-architecture/main/tutorials/meetcomposablearchitecture)は一通り目を通し、簡単にでも自分でサンプルアプリを作ったことがある方を想定しています。

簡単なサンプルアプリを作れるレベルから一歩先に進むために必要な技術要素を学べることをイメージしています。

元記事を表示

PencilKitで高解像度の写真に絵を描く

## はじめに

PencilKitで高解像度の画像をスクロールして絵を描けるようにする方法で悩んだので、備忘録です。

## 概要

– PKCanvasViewはStoryboardで設定
– 高解像度の画像を表示する場合はスクロールして絵を描けるようにする
– 画面に収まる画像の場合は画面中央に配置して絵を描けるようにする
– 画像外は絵を描けないようにする

## ソースコード
“`swift
class ViewController: UIViewController {

@IBOutlet weak var canvasView: PKCanvasView!
private let imageView: UIImageView = UIImageView()
private let pkToolPicker = PKToolPicker()

override func viewDidLoad() {
super.viewDidLoad()
setupPencilKit()
}

元記事を表示

【SwiftUI】TCAのNavigationStackStoreを使うための最もシンプルなサンプル

# はじめに

NavigationStackStoreを使うための最もシンプルなサンプルを作成したのでコピペして使ってください

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-14 at 22.22.05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6d5a45d7-6f32-079f-b7c3-c44e52fd67ec.gif)

# 実装
### ParentView
“`ParentView.swift
import SwiftUI
import ComposableArchitecture

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

let store: StoreOf

public init(

元記事を表示

5歳児向けの依存性注入から考えるアプリ開発の DI

# 本記事のターゲット

– DI の基本を理解しているが、もう少し理解を深めたい
– アプリ開発(Android/iOS)で DI を採用したことがある。あるいは、これから採用しようとしている

# キーワード

– Dependency Injection
– Service Locator
– Property Injection
– Constructor Injection
– Composition Root

# はじめに

まず、英語版 Wikipedia の [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection) の記事に面白い喩え話が載っているので、引用したい。

> Dependency injection for five-year-olds
>
> When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the do

元記事を表示

【Flutter】Xcode 15でiOS 17のシュミレーターが起動しないUnable to get list of installed Simulator runtimes

# はじめに
なぜかiPhoneシュミレーターが起動しない事件が発生した。。。。
「またか・・」
とため息をつきながら👇の対応を行った。

https://qiita.com/kokogento/items/465984cad8624f483782

**しかし、今回はいくらキャッシュを消してもシュミレーターが起動しない!!!!**

「何かがおかしい:expressionless:」

そう思いとりあえず`flutter doctor`で確認

“`console
% flutter doctor (git)-[master]
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.3, on macOS 14.1 23

元記事を表示

iOSでのレイアウト崩れ問題とその対処法

## 事象

Next.js と Tailwind CSS を使用してiOS向けのレスポンシブ対応を行っている際に、mainタグにh-screenを適用してもiOSのアドレスバーが画面下部に表示されることでレイアウトが崩れる現象が発生しました。

## 対処法

この問題の原因は、iOSでのビューポートの高さ (vh) が動的に変化するため、アドレスバーの表示によってビューポートの高さが変わり、それがレイアウト崩れを引き起こしていました。これを解決するためには、Tailwind CSSの設定を以下のように変更します。この設定では、標準のビューポート高さ (vh) ではなく、ダイナミックビューポート高さ (dvh) を使用しています。

“`tailwind.config.ts
module.exports = {
theme: {
extend: {
// Solutions for Safari address bar display issues
height: {
screen: [“100vh”, “100dvh”],

元記事を表示

【最新】Unity でiOS, Android バイブレーションを簡単に共通化!Nice vibration, Feelを使って手軽に!

Unityで人気のアセット、Nice Vibration(Feelに統合された)のプリセットバイブレーション一覧がこちら。

これらのメソッドを使うだけでいい感じになる。

“`
public virtual void SelectionButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Selection);
}

public virtual void SuccessButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Success);
}

public virtual void WarningButton()
{
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Warning);
}

public virtual void FailureButton(

元記事を表示

【SwiftUI】trimで図形の一部のみを表示させる

# はじめに
正方形をtrimを使って切り取ってみます。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-11-13 at 22.50.32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7032ce18-0caa-6450-2e6e-db3a3fedf452.gif)

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@State private var trim1: CGFloat = 0

@State private var trim2: CGFloat = 0

var body: some View {
VStack {
Rectangle()
.trim(from: trim1, to: trim2)
.f

元記事を表示

アラートテンプレ集(コピペおけ)

実際によく使う順にアラート(UIAlertController)のテンプレをご用意しました。最後の全体コードをあなたのXcodeプロジェクトに新しくswiftファイルを作ってコピペすれば、すぐにご利用頂けます。

## 目次
[タスク完了アラート](#タスク完了アラート)
[エラー発生アラート](#エラー発生アラート)
[短文説明アラート](#短文説明アラート)
[二択(はいorいいえ)アラート](#二択アラート)
[入力欄付きアラート](#入力欄付きアラート)
[文字数オーバーアラート](#文字数オーバーアラート)
[入力破棄して画面巻き戻しアラート](#入力破棄して画面巻き戻しアラート)
[全体コード](#全体コード)

## タスク完了アラート
“`swift:AlertExtension.swift
static func taskDoneAlert(taskString: String, viewController: UIViewController, completion: (() -> Void)?) {
let alert = UIAlertCont

元記事を表示

Bitriseの機能を使ってSwiftLintを導入

# 概要
BitriseでiOSアプリのCI/CD環境を構築すると簡単にSwiftLintのチェックを導入する事ができます。Bitriseの機能を使用しておりFastlaneやDangerを使用してません。
## 前提
本記事は以下の前提で作ってます。
– Bitriseでアプリのビルドを完了している事。
– SwiftLintをSwiftPMで導入している事。
– `BuildTools`ディレクトリに`Package.swift`を置いている事。
– `.swiftlint.yml`がプロジェクトルートにある事。
## Bitriseのステップ構成
全体のステップに関しては以下になります。

### 1. `Activate SSH key (RSA private key)` ステップ
– 役割
– Bitr

元記事を表示

【SwiftUI】@ScaledMetricを使ってフォントサイズを柔軟に対応する

# はじめに
`@ScaledMetric`という機能がiOS14から使えるようになっています
通常、サイズに関する値を数値で指定すると固定の値になってしまうところ、`@ScaledMetric`を使用して指定するといい感じにサイズ変更してくれます

# 実装
“`swift
import SwiftUI

struct ContentView: View {
@ScaledMetric private var fontSize1: CGFloat = 20

private var fontSize2: CGFloat = 20

var body: some View {
VStack(spacing: 50) {
Text(“動的サイズ”)
.font(.system(size: fontSize1))

Text(“固定サイズ”)
.font(.system(size: fontSize2))
}

元記事を表示

Observation (iOS17+) の注意点

今回は監視フレームワーク・通知機構のObservationの話。
Observationを使用してメモリが圧迫する状況があったので調査しました。

開発アプリPR

3分作曲-musicLine-

元記事を表示

【iOS×Figma】CustomSFSymbolsをFigmaから自動生成するプラグインがえぐい

# はじめに

HIG輪読会という勉強会で紹介されてたツールをlog5さんがツイートしてるのを見て知りました
使ってみたらめっちゃすごかったので記事にしておきます。

Figma初心者の私でも簡単に使えました!

以前、CustomSFSymbolを作ったのですが、めっちゃ大変だったのでこのツールは革命です

https://qiita.com/SNQ-2001/items/1bef9b55d449636720a2

個人開発者にとっては必須のツールだと思います。

# 使い方
### 1, 「SF Symbols Optimizer」をインストールする
https://www.figma.com/community/plugin/1265484574589944515/sf-symbols-optimizer

上記のリンクにはいります。

「Try it out」を選択して編集画面に行きます。
![スクリーンショット 2023-11-11 22.25.56.png](https:

元記事を表示

[Swift] このコードは書かないでください!(代わりに幽霊型を使いましょう)

## 前提

上記Youtubeを日本語でざっくり解説します。
※あくまでも私のアウトプットなので間違っていたらご教授いただけますと幸いです。

## どのような内容か

以下は、コンパイルエラーが発生しないコードです。
“`swift
import Foundation

struct Person {
let id = UUID()
let name: String
}

struct Location {
let id = UUID()
let coordinates: (Double, Double)
}

func handle(locations: [Location]) {
let me = Person(name: “Test”)
let filtered = locations.filter { $0.id == me.id }
}
“`

以下は、コンパイルエラーが発生するコードです。
“`swift
import Found

元記事を表示

Swiftで仕様パターン(Specificationパターン)

[前回](https://qiita.com/Se1getsu/items/b6421b3080177869c4f6)に引き続き、Modelの設計の勉強として「[ドメイン駆動設計入門](https://www.shoeisha.co.jp/book/detail/9784798150727)」を読んでいます。サンプルコードはC#で書かれていますが、iOSを勉強している人にもオススメの一冊です。

今回は、**13章**に出てきた**仕様パターン**が面白かったので、Swiftのコードを使ってまとめます。

# 仕様パターンとは
**仕様**(Specification)は、**オブジェクトの評価**を行うオブジェクトです。
主に以下の2つの用途で使われます。
– **検証**(バリデーション)
– **選択**(フィルタリング)

それでは、仕様パターンを使わない方法から見ていきましょう。

# 元となるModel
例えば、ToDoアプリのドメインモデルとして、以下のようなModelがあるとします。
“`swift
struct ToDo {
private let id:

元記事を表示

【SwiftUI】API通信でデータを取得してみた

# 概要
Swift Concurrencyを使用して非同期処理(async/await)をAPI通信で実装しました。
仕様としては、特定のタグが含まれる記事を一覧表示させるというもので、検索機能、ログイン機能は一切持たせていません。
# API通信について
API通信では外部ライブラリを使用せず、標準の`URLSession`と`JSONDecoder`を使用しました。APIはQiitaのAPIを使用しています。
動作の流れにそって説明していきます。
#### 動作の流れ
1. `URL`の生成
1. `URLRequest`の生成
1. `URLSession`でJSON形式のデータを取得
1. 取得したJSON形式のデータを`JSONDecoder`でデコード
1. 表示用の配列に格納

### 1. URLの生成
サーバーへのリクエストをするためのURLを生成します。`struct`の中に記述していきます。
まずは最低限必要なものから説明します。
“`Swift
let baseURL: URL? = URL(string: “https://qiita.com/ap

元記事を表示

Redux Saga for Swift

:::note info
本記事は [技術書典15](https://techbookfest.org/event/tbf15) で無料配布する同人誌「[ゆめみ大技林 ’23 (2)](https://techbookfest.org/product/2nuPxEDA5h1DQY26u38mrY?productVariantID=62SKMF1Q39YF7bEkYdzPu0)」の寄稿です。加筆や修正などがある場合はこの記事で行います。
:::

あなたのお気に入りのアーキテクチャは何ですか。私のお気に入りは Redux Saga です。Redux Saga [^redux-saga] は単方向データフローの Redux [^redux] を拡張し、非同期処理や副作用を直感的に管理できるようにしたアーキテクチャです。ビジネスロジックなどを Saga にまとめることで、責務を明確に分けることができます。

Redux Saga は JavaScript で作成され Web(React)や React Native などの開発でよく用いられています。同じ宣言的 UI の SwiftUI との

元記事を表示

OTHERカテゴリの最新記事