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

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

【Swift】実は2つ以上使える!トレイリングクロージャ

# 目次
[1.実は2つ以上使える!トレイリングクロージャ](#1-実は2つ以上使える!トレイリングクロージャ)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. 実は2つ以上使える!トレイリングクロージャ
トレイリングクロージャって便利ですよね。
関数の引数にクロージャが最後にあった時に呼び出す側で見やすくしてくれる記法です。
でも実は、、、引数に2つ以上クロージャがある時にも使用できるんです!!

# 2. 実例
関数定義側
~~~swift:function.swift
func example1(
value: Int,
closure1: (Int) -> String,
closure2: (String) -> Bool,
closure3: (Bool) -> Int
) -> Int {
let value1 = closure1(value)
let value2 = closure2(value1)
let value3 = closure3(value2)
return v

元記事を表示

空間ビデオ(Spatial Video)を青赤メガネで立体視する

# 空間ビデオ(Spatial Video)を青赤メガネで立体視する
iOS 17.2から、iPhone 15 ProとiPhone 15 Pro Maxは、空間ビデオを撮影できるようになりました

https://www.apple.com/jp/newsroom/2023/12/apple-introduces-spatial-video-capture-on-iphone-15-pro/

ざっくりまとめると、iPhoneの2つのカメラで同時に撮影し、撮影した映像をApple Vision Proでそれぞれ左右の目に提示することで、立体的に動画を視聴することができるようです、たぶん(すごい!)
しかし、せっかく空間ビデオで撮影してもApple Vision Proは日本では未発売(2024年1月現在)なので、Spatialな空間感を感じることができません
そこで、空間ビデオの左右の目用のそれぞれの映像を取得し、伝統的?な立体視の手法である赤青のメガネで見ると立体的に見える**アナグリフ**で表示することで、空間ビデオを立体視してみました

Node.jsを用いてTODOリストを管理するAPIを作ってみた(初学者向け)

# はじめに

私はAPIを作成したことがなく、サーバーサイドの知見が少ないです。APIを理解するために、Node.jsを用いてローカルでTODOリストを管理するAPIを作成します。初学者の私がAPIを作成することを目的としており、GET POST メソッドなどの基本的な部分に着目して記載しています。そのため、今回はデータの永続化などは考慮していません。

# セットアップ
まずは、新規プロジェクトを作成します。

新しいディレクトリを作成
“`
mkdir todo-api
“`

ディレクトリ内へ
“`
cd todo-api
“`

プロジェクトをセットアップ
“`
npm init -y
“`

出力結果) package.jsonが生成される
“`
Wrote to /Users/(自身のPCのディレクトリ)/ReactNativeProject/todo-api/package.json:

{
“name”: “todo-api”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.j

【SwiftUI】Textの行間スペースを調整する

# はじめに
Textの行間スペースを調整するという内容です。
どこのことだ?と思うかたもいると思うので画像で説明します。

![スクリーンショット 2024-01-24 21.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bcdf28c3-edae-2154-caa3-a6c79ccede15.png)

改行された文と文の間のスペースを本記事では行間スペースと表現しています。

# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2024-01-24 at 21.57.08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4ba10179-b751-1a03-5847-042ec8c25bff.gif)

# サンプルアプリの実装
“`diff_swift
import SwiftUI

struct ContentVi

元記事を表示

Intune フィルターで、iOS と iPadOS を区別してポリシー適用する!

先日ユーザーグループ割り当てのポリシーにおいて iOS と iPadOS を区別して適用したいなと思い、Intune のフィルターを使ったところ、見事理想通りに小回りを利かせることができました!

## ポリシー割り当て基本動作
基本的に Intune ではプラットフォーム (OS) ごとにポリシーを作成するため、各ポリシーは該当する OS のデバイスにのみ適用されます。例えば Windows プラットフォームのポリシーは iOS/iPadOS デバイスには適用されません。
ただし、Intune 上で iOS と iPadOS はほとんどの機能でひとくくりにされており、「iOS/iPadOS」というのがひとつのプラットフォームカテゴリになっており iOS と iPadOS は OS として区別されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659465/0507a9ef-8d2d-79a0-944b-a5ae9e7f2c6e.png)

このため、iOS/iPadOS プラ

元記事を表示

【SwiftUI】Previewを実機で行う

# はじめに
Previewを実機でできるってことは知っていたのですが、やったことがなかったのでやってみました。
やり方を記事にします。

“`swift
import SwiftUI

struct ContentView: View {
var body: some View {
Circle().frame(width: 100, height: 100)
}
}

#Preview {
ContentView()
}
“`

今回の例では上記のコードを使用します。

# やりかた
まず、Previewを開きます。
![スクリーンショット 2024-01-23 20.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/08eb0be3-e578-cf74-edcc-e30b6dfb01e7.png)

Previewの下に現在のPreview機種が書かれているボタンがあるので選択します。
![スクリーンショット 2024-01-23

元記事を表示

(再確認)遅ればせながら、UIKitベースプロジェクトでSwiftUIの画面を表示してみた

## 概要
本当に今更ながら、UIKitベースのプロジェクトでSwiftUIの画面を表示してみました!
以下のようなサンプルを使用して、動作を確認しました!

[![Image from Gyazo](https://i.gyazo.com/5d16ad4c43d86722c71de216f0953eec.gif)](https://gyazo.com/5d16ad4c43d86722c71de216f0953eec)

:::note
この記事はこんな方におすすめ
– そろそろUIKitベースのプロジェクトにSwiftUIの画面を導入してみたい方
– UIKitとSwitfUIの共存に興味がある方
– iOSエンジニア (全員やん。)
:::

:::note warn
警告
– 目新しい技術というよりは、技術の再確認というような記事です。
– 簡単な画面遷移のみできるようにしたサンプルなので、業務等で使用する際はより深い理解が必要になります。
:::

## モチベーション
なぜ今回この記事を書いたかというと、業務ではSwiftUIベースのプロジェクトアプリを実装しているのですが、

元記事を表示

【Swift】throwsってなんやねん

# 目次
[1.throwsってなんやねん](#1-throwってなんやねん)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. throwsってなんやねん
他言語経験者からすると、Swiftの`throws`って??となりませんか笑
本記事では、`throws`を実例をもとに解説してみます。
一言で言うと`エラーを投げまっせ`みたいな宣言をしているんでしょうかね。。

# 2. 実例
条件
ここでは割り算の結果が以下の場合について考えます。
– 3で割り切れる:threeError
– 7で割り切れる:sevenError
相当3や7で割り切れることに対して不満があるみたいです笑

早速コードです。
成功パターン
~~~swift:throw.swift
import Foundation

enum Errors: Error {
case threeError
case sevenError
}
func checkErrors(a: Int, b: Int) throws {
let answer = a / b
if answer

元記事を表示

【Swift】【R.swift】※注意 identifierをつけましょうね

# 目次
[1.R.swiftの変数部分でセルが呼び出せない](#1-SwiftCombineとは)
[2.解決方法](#2-sink)

# 1. R.swiftの変数部分でセルが呼び出せない
R.swiftを導入しているのに、なぜかR.swiftの変数を呼び出す部分で怒られる
~~~swift:
tableView.register(R.nib.XXXcell)
~~~
発生したエラー
~~~
No exact matches in call to instance method ‘register’
~~~

うーん、、、tableViewは`register`メソッド持っているけどな〜
間違っていたのはR.swift部分でした。

# 2. 解決方法
xibファイルの`identifer(アイデンティファー)`を設定していませんでした。
→どうやらR.Swiftはこのidentiferを使って変数を定義しているみたい。
![スクリーンショット 2024-01-23 9.49.52.png](https://qiita-image-store.s3.ap-northeast-1

元記事を表示

ReactNativeでTODOアプリ作ってみた

# はじめに
今回は、ReactNativeを用いてTODOアプリを作成していく。

環境構築がまだの方は、こちらを参考にお願いします。

https://qiita.com/muranakar/items/8d0cb2044fe836fe758e

今回はこちらのライブラリーを用いて実装していきます。

https://reactnativeelements.com/

https://github.com/oblador/react-native-vector-icons

# 内容
### ライブラリーをインストール
“`
npm install react-native-elements react-native-vector-icons
“`

### タスクの変数と関数を用意
“`react
const [task, setTask] = useState(”);
const [tasks, setTasks] = useState([]);
“`
`task`と`tasks`の状態変数:
– `task` は現在のタスクの文字列を格納します。ユーザーが

元記事を表示

[学びメモ] enumで2つのクラス共通で利用するメソッドを定義する

# 本記事について

この記事では、2つのクラスで共通して利用するメソッドを定義する方法について紹介します。

提案するアプローチはあくまで一つの意見であり、唯一の正解ではありません。プロジェクトや状況によって最適な方法が異なることを考慮に入れ、参考にしていただければと思います。

# シナリオ

画面Aと画面Bでは、特定の要素のカウント数に基づいて、デフォルトで用意された数値の配列を返すメソッドが定義されています。

“`swift
func makeDefaultNumbers(elementCount: Int) -> [Int] {
switch count {
case 1:
return [100]
case 2:
return [50, 50]
case 3:
return [34, 33, 33]
default:
return []
}
}
“`

課題として、仕様変更時に変更を見逃す可能性を減らすために、共通化したいです。

# アプローチ

en

元記事を表示

【SwiftUI】safeAreaPaddingでScrollViewの開始位置と終了位置を調整する

# はじめに
`ScrollView`に`padding`を付けると`ScrollView`が小さくなってしまいます。
しかし、`safeAreaPadding`だと`ScrollView`は小さくならず、コンテンツのみにスペースが入っているっぽいです。

# 比較
`padding`だと`ScrollView`が小さくなって途中で途切れているのがわかります。
|`padding`|`safeAreaPadding`|
|-|-|
|![Simulator Screen Recording – iPhone 15 – 2024-01-22 at 21.59.53.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8b3cb8e8-1e23-420e-62e8-b074853d90c5.gif)|![Simulator Screen Recording – iPhone 15 – 2024-01-22 at 22.00.31.gif](https://qiita-image-store.s3.

元記事を表示

Bitriseのキャッシュ機構(最新)

Bitriseにはキャッシュ機構が3種類存在します。今回は使用頻度の高い2つについてまとめました。

1. Branch-based caching ⭐️
1. Key-based caching ⭐️
3. Remote build caching

# Branch-based caching
従来から使われているキャッシュ機構。ブランチ毎にキャッシュが作成されます。
作成したキャッシュは同一のサーバー上のみで使用することができます。

### 使い方
キャッシュの作成には`Bitrise.io Cache:Push`を使います。

このステップでは`Cache paths`にキャッシュ対象のパスを指定します。
例えば`CocoaPods`であればこうなります。
“`
# CocoaPods
./Pods -> ./Pod

元記事を表示

【Swift】【Combine】mergeとCombineLatestの違いを説明してみる

# 目次
[1.mergeとCombineLatest](#1-SwiftCombineとは)
[2.marge](#2-sink)
[3.CombineLatest](#3-store)
[4.おわりに](#5-おわりに)

# 1. mergeとCombineLatest
RxSwift+MVVM → Combine+TCAにリファクタしている過程で以下の疑問点が湧いてきました。
`marge`と`CombineLatest`どちらもストリームを束ねる点では共通です。
では、何が違うのか解説していきます。

# 2. merge
`merge`は2つのストリームを束ねて、どちらかが流れてきたら実行しまっせという感じです。
:::note info
mergはOR条件と思っておけば良いでしょう!
:::

~~~swift: merge.swift
import RxRelay
class ExampleViewModel {
// input
let didTappedIndexButton = PublishRelay()
let didInp

元記事を表示

【SwiftUI】iOS17でwithAnimationが強化された

# はじめに
`withAnimation`にパラメータが2つ増えました。
まず、1つ目はアニメーションの終了が検知できるように`completion`が追加されました。
2つ目はアニメーションの終了をどことするかを指定する`completionCriteria`です。

解説していきます。

# アニメーションの終了が検知できるようになった
“`swift
import SwiftUI

struct ContentView: View {
@State private var degrees: Double = 0.0

@State private var status = “”

var body: some View {
VStack(spacing: 60) {
Text(status)

Rectangle()
.frame(width: 200, height: 200)
.ro

元記事を表示

[学びメモ] async letを用いた並列処理でタスク結果の取得タイミングを変えたい時の実装方法

# 本記事について

Swift Concurrencyを用いた並列処理において、曖昧な理解で実装していたのでメモとして残します。

`async let`を用いて並列処理を行う際、実装方法によってタスク結果の取得タイミングを変えることが可能です。

# 具体例

以下、2パターンの挙動の実現が可能になります。

– パターン1:両方のタスクが完了するまで待機してから、両方の結果を同時に取得
– パターン2:各タスクの結果が利用可能になるとすぐにそれを取得し、次の結果の取得を待つ

もう少しイメージしやすいように、イメージ図とコードを示します。

## パターン1

“`Pattern1.swift
async let response1 = fetch1()
async let response2 = fetch2()

元記事を表示

ReactNativeでTabを用いて画面遷移

## はじめに

前回は、Push遷移での画面遷移を学習し、記事を書きました。参考までに

https://qiita.com/muranakar/items/34a124556dc7ad2f8e89

今回は画面遷移の学習の続きで、Tabでの画面遷移実装を行っていく。

こちらのライブラリーを用いて実装していきます。

https://reactnavigation.org/docs/bottom-tab-navigator/

## 内容
### ライブラリーをインストール
“`
npm install @react-navigation/bottom-tabs
“`
以下が出力される。
“`
added 1 package, and audited 1191 packages in 11s

65 packages are looking for funding
run `npm fund` for details

5 moderate severity vulnerabilities

To address all issues (including break

元記事を表示

ReactNativeで画面遷移する

## はじめに
ReactNativeを用いて画面遷移の実装を行っていく。

環境構築に関しては以下のリンクを参照ください。

https://qiita.com/muranakar/items/8d0cb2044fe836fe758e

## 画面遷移に関して

### ライブラリーのインストール
画面遷移を実現するために、下記のライブラリーをインストールします。

https://reactnavigation.org/docs/stack-navigator/

https://reactnavigation.org/docs/native-stack-navigator/

以下を実行
“`
npm install @react-navigation/native @react-navigation/stack
“`

出力結果
“`

added 29 packages, and audited 1625 packages in 16s

123 packages are looking for funding
run `npm fund` for details

元記事を表示

【Xcode】関数の引数などをコマンドで一括改行する

# はじめに
引数の多い関数を見やすいように改行することはよくありますよね。
でも、1つ1つ選択して改行するのめんどくさい、、、って思います。

![画面収録-2024-01-20-22.34.27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/61a0fdff-8db6-4190-c5db-d9699b812aea.gif)

それXcodeのショートカットコマンドで解決できるんです!

# やりかた

対象箇所を選択して、

`control` + `M`

だけ

# おわり
printなど改行しなくていい箇所も改行されるので、選択箇所は考えたほうがいいですね

![画面収録-2024-01-20-22.37.29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/26b1b5ac-3ffa-c911-e9ab-486d7c765d7f.gif)

元記事を表示

エッジジャスチャーで地図をぬるぬるズーム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/dd5a4175-953b-09e1-f908-0c35b7dc7f77.png)

画面端からのスワイプジェスチャーでMapKitの地図表示をズームさせるサンプルプログラムです。

# つくったもの
画面左右の端からのスワイプ量に応じて地図がぬるぬるっとズームイン・ズームアウトします。現在地を表示するカスタムピンも実装してみました。

![IMG_8690.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77444/92d4b6dd-6067-19b2-7853-6fdac4418d43.png)

## 環境
– Xcode 15.2
– iOS 17.2.1

# 実装ポイント

## MapKitのMKMapViewのタップジャスチャーをインターセプト
MKMapViewのタップイベントをトリガーにズームするとMapKitの挙動と干渉してしま

元記事を表示

OTHERカテゴリの最新記事