iOS関連のことを調べてみた2022年10月08日

iOS関連のことを調べてみた2022年10月08日

iOSアプリ設計パターン入門(第2章:設定パターンを適用する前に)

# 概要
「責務」「パターン」「設計の原則」の3つを中心に設計プロセスについて説明しており、設計パターンをする前にSwiftにおけるプログラミングの作法を中心に説明している。

# まとめ
「責務」「パターン」「設計の原則」の3つを中心に設計プロセスについて説明してくれている。

# 学び
・責務とは、解決すべき問題の領域のことで、モジュールに責務をまとめて置いている。
・責務分離が適切に行われた状態は、モジュール内で責務がまとまっており高凝集といい、モジュール同士では責務が分かれている疎結合状態という。
・あるモジュールの責務は、他のモジュールとは分離されているはずでありその境界線を崩してしまうと、重大なエラーを発生させてしまう可能性もある。
・Apple公式によるUIViewControllerの役割は、以下の4点である。
①データの変化に応じてViewsの内容を更新②ユーザーインタラクションへの反応③レイアウトの管理④他のオブジェクトとの連携
・関数や変数を命名する際には、「ユーザーがそこ関数の挙動を行うと、どのような処理を動くのか」を考えて命名すると他のメンバーも関数や変数に関

元記事を表示

iOSアプリ設計パターン入門(第1章:設計するということ)

# 概要
本書の本質的な部分を説明する前に、「iOSエンジニアとして設計するということ」の意義を簡単にまとめてくれている。昨今、iOSの開発環境が進化し、アプリ自身も成長している中で、膨大なコードをどのように書くのかを考えた上で開発しなければ、複雑にコードが絡み合い非効率になる。
そのため、そもそもなぜ設計を学ぶ必要があるかを説明してくれていた。

# まとめ
アプリの持つ複雑な問題を「関心の分離」によって小さな問題へと切り分けるといる、そのことを設計するという行為で、そのための武器がパターンである。

# 学び
・iOSアプリの開発事情「アプリでできることが増えた」「頻繁・継続的なリリース」「アプリの大規模化」「プロジェクトの長期化」「チーム開発での分業化」が挙げられる。
・関心の分離とは、アプリ開発における解決するべき問題(実装したいこと)をできる限り小さな単位で分けてコードを管理すること
・設計パターンは、複雑な問題をより簡単な問題群として切り分けるために活用できるもので、再現性のある問題に対する共通の解決策のこと
・パターンを知るメリットは、「問題を定型化して捉えられる」「解決

元記事を表示

【Swift】上がりながら消えていくアニメーションを実装する

# はじめに
いま作ってるアプリで「上がりながら消えていくアニメーション」を実装したので方法を共有します。

# イメージ
![Simulator Screen Recording – iPhone 12 – 2022-10-07 at 20.59.10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/99e8bde8-c51a-2295-c299-17a74f92a234.gif)

# 実装
※関係ないところは省いてます
`RxGesture`の`panGesture`で指が離れた位置を取得します。
指が離れた位置にラベルを配置します。
`UIView.animate`でラベルにアニメーションを追加します。

“`swift
view.rx
.panGesture()
.when(.ended)
.subscribe(onNext: { position in
self.makeCountUpLabel(position: position)

元記事を表示

iOS16時代のLaunch ScreenとInfo.plistとSwiftUI

# はじめに
「部屋とYシャツと私」みたいなタイトルになりましたが、
SwiftUIのみでアプリ開発する時に便利な、Info.plistでLaunch Screenを設定する方法について記載します。
本当はiOS14時代から設定できるようになっていましたが、Xcode14で試してみると他の方の記事の内容と差異があったので、最新手順や調査結果、所感なども記載します。

# まとめ

– 今時のLaunch Screenはカスタマイズして作るものではなくなりました。
Info.plistでLaunch Screenを設定するのであれば、
– **デフォルト設定のままで良い。(systemBackground背景色のみ)**
– **設定したとしても背景色のみで十分。**
– iOS16でアップル純正のプリインストールアプリをいくつか調査しましたが、特別なLaunch Screenは設定されておらず、デフォルト設定となっているようです。

## 理由
(黄色い背景がLaunch Screen)
![timeline.png](https://qiita-image-sto

元記事を表示

Property WrapperとCodableを使ってJSON解析時のデータ型を変換する

### Property Wrapperとは
プロパティに対して制御を行う仕組み
[Swift Language Guide](https://docs.swift.org/swift-book/LanguageGuide/Properties.html)
### Codableとは
JSON形式を任意のデータ型に変換するプロトコル
[Appleのドキュメント](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types)
### CodableとProperty Wrapperを連携して使う場面
例えばJSONではStringで定義されたが、実際アプリで使う際はIntになる場合など

Json File
“`json
{
“id”:”200″
“version”:”100″ //アプリ側は数値として使いたい
}
“`
Swift Code
“`swift
struct Hoge: Codable {
l

元記事を表示

【2022最新版】法人がiOSアプリをApp Storeに非表示アプリとしてリリースする方法

## はじめに
「iOSアプリのエンタープライズ配布がもう限界だ。非表示?非公開?Appってやつで配信したいので調べて。」と上司に言われてスタートしたApp Storeへのリリース作業。
これが思いのほか大変だったので、手順をまとめてみました。

## 対象者
この記事は下記のような人を対象にしています。

– 駆け出しエンジニア
– プログラミング初学者
– 初めてiOSアプリをリリースする方
– 非表示アプリに興味があるけど、リリース方法調べるのが面倒な方

## 結論
ゼロから始めたら1~2ヶ月はかかるから早めに着手しよう!

***
## **1. iOSアプリの配布方法**
まずはiOSアプリの配信方法について、おさらいします。
### a. AppStore公開App(app)
最も一般的な配布方法。AppStoreで公開されるアプリ。
### b. エンタープライズ([ADEP](https://developer.apple.com/jp/programs/enterprise/))
2020年ごろまで主流だった、従業員向けアプリの配布方法。【Swift】Storyboardを削除してXibで開発をする

# はじめに
Storyboardを使用して開発を進めるとStoryboardが肥大化していきます。
肥大化したStoryboardでコンフリクトが発生すると取り返しのつかないことになることは予想できます。
そのような事態を未然に防ぐためにviewごとにxibを作成して開発をします。
今回はそのやり方を記事にしておきます。

# Mainの削除
① Mainを右クリックします
② 「Delete」を押します
![スクリーンショット 2022-10-06 18.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dda5d094-a12b-6107-7fb4-94e6b83419c1.png)

「Move to Trash」を選択します。
![スクリーンショット 2022-10-06 18.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cfeba53b-8ae2-b42b

【Xcode14】Storyboardを削除してコードベースで開発する

# はじめに
以前[Stroyboardを削除してコードのみで開発する方法](https://qiita.com/SNQ-2001/items/d680d8bb4a73106bdefb)の記事をあげましたが、Xcode14でやり方が変わっていたので紹介します。

# Storyboardを削除
「Main」を右クリックして「Delete」を選択
![スクリーンショット 2022-10-05 19.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ff81293e-a969-7760-4735-68e3be33a287.png)
Move to Trashを選択
![スクリーンショット 2022-05-17 0.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1e98c549-eb4c-fb73-41c2-910082437a58.png)

|Move to Trash|

Cookpad Summer Internship 2022 体験記

## はじめに
都内のスタートアップで一年ほど従事していました、学生iosエンジニアのにいまるです。

クックパッドのインターンが4ぬほど楽しかったので紹介しちゃいます
[Cookpad Summer Internship 2022](https://internship.cookpad.jp/)

## 応募したきっかけ
毎日の料理を楽しみにするという、クックパッドのサービス開発の思いや社風が好きで気になっていたからです。研究室の友人が就業型のインターンに参加をしていて、そのきっかけで自分も応募しました。

techブログでよく見かけるため技術力の高い会社という認識はあり、それなりに準備して選考に取り組みました。

## 選考
こわいので細かく言いませんが面白い技術テストと普通の面接でした〜

選考の中でも、社員さんは皆同じ志を持っていて、み

Flutter Mac iOSデバッグ時にシュミレーターでキーボードを表示&入力指定

普段実機でデバッグ作業をしていると、エディタの`iOSシュミレーター`で検証をお願いされた時、テキストフォーム入力時にあれ? シュミレーター上でキーボードが出ない。。。なんてことがあります。

しばらく使っていなかったせいか、`iOSシュミレーター`のデフォルトでは`Mac本体`のキーボードが指定されているので
# command + shift + K

を同時押しすることで切り替えて出現させることを忘れていました。

![スクリーンショット 2022-10-05 12.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/da86b0bc-4b20-4904-1a76-57974137d58b.png)
![スクリーンショット 2022-10-05 12.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/c430471c-e269-0e5e-6b40-713c472c195

【Swift】RxGestureでのスワイプ検知がまじ簡単

# はじめに
いまRxSwiftの勉強中でして、RxSwiftを使ってアプリを1個リリースするという目標を立てて頑張っています。
勉強中に出会ったRxGestureがめっちゃ便利だったので記録しておきます。

# スワイプの監視
### 上方向スワイプ
“`swift
view.rx
.swipeGesture(.up)
.when(.recognized)
.subscribe(onNext: { _ in
print(“上方向にスワイプしました”)
})
.disposed(by: disposeBag)
“`
### 下方向スワイプ
“`swift
view.rx
.swipeGesture(.down)
.when(.recognized)
.subscribe(onNext: { _ in
print(“下方向にスワイプしました”)
})
.disposed(by: disposeBag)
“`
### 右方向スワイプ
“`swift
view.rx

【Coremltools】PyTorchのモデルをCoreMLに変換する際にハマりまくった話

# 背景??

CoreMLとは、iPhoneやMac上で動く機械学習ライブラリです。
このライブラリが優れているのは、端末内で機械学習を行えるだけではなく、
TensorFlowやPytorchのモデルを変換してスマホに搭載することもできるんですね。

モデルの変換にはCoremltoolsというものを使います。[公式のサイト](https://coremltools.readme.io/docs)のチュートリアルを見れば、
変換するところまでは簡単です。しかし、今回、変換させたCoreMLが正しい分類結果を出してくれずに
数日間悩んだので、解決策を載せておきます。

ハマったのは以下の点です。
– 分類における確率が「1100%」とかとんでもない値になる
– PyTorchのモデルで分類したときの結果と一致しない
– 変換できたけれどSwiftUIでエラーが出て動かない

# PyTorchのモデル → CoreMLのモデル

[公式のサイトのPyTorch conversion](https://coremltools.readme.io/docs/p

【Swift】文字列を分割して配列にする

# はじめに
Pythonの`split`みたいなことをSwiftでしたいと思った時にやり方がわからなかったので記録しておきます。

# やりかた
### Pyhton
“`python
str = “1 2 3 4 5″

print(str.split(” “))

# [“1”, “2”, “3”, “4”, “5”]
“`

### Swift
“`swift
import Foundation

let str = “1 2 3 4 5″

print(str.components(separatedBy: ” “))

// [“1”, “2”, “3”, “4”, “5”]
“`

# おわり
似てるからごっちゃになる!

【Swift】Dateは扱いにくい!!

# はじめに
Dateは扱いにくい!!
こんなふうに使いたい!!!
“`swift
Date(string: “2022/05/10 12:00:00”)
“`

# 実装
“`swift
extension Date {
init(string: String, format: String = “yyyy/MM/dd HH:mm:ss”) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
dateFormatter.locale = Locale.current
dateFormatter.timeZone = TimeZone.current
dateFormatter.calendar = Calendar(identifier: .gregorian)
guard let date = dateFormatter.date(from: string) else {

【Xcode】プロジェクト名を変更する

# はじめに
あとからプロジェクト名を変更したくなることがあると思います。
プロジェクト名の変更の仕方と躓きポイントを紹介できたらと思います。

YubikiriMaster → Metronome

# やりかた

### プロジェクトをリイネームする
プロジェクト名をリネームモードにします。
![スクリーンショット 2022-10-01 20.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5dc05443-e8e5-7f7e-8a77-136c55006bd7.png)
`Metronome`にリネームします。
![スクリーンショット 2022-10-01 20.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5e24d1be-c266-3fe6-dd61-18d2c18d74b1.png)
「Rename」を押します。
![スクリーンショット 2022-10-0

日記アプリリリースしました!

## はじめに

この度、初めてのスマホアプリである「テンプレ日記」という日記アプリをリリースしたので紹介します!

「**テンプレ日記**」で検索すると一番上に出てくるので、興味を持った方は是非インストールして見てください!

## ios版

https://apps.apple.com/jp/app/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E6%97%A5%E8%A8%98/id1638009071

## Android版

https://play.google.com/store/apps/details?id=com.hayatosato.diary

## 「テンプレ日記」の特徴

早速ですが、今回リリースした「**テンプレ日記**」の特徴を紹介します。
「**テンプレ日記**」の特徴は以下の通りです。

1. テンプレート機能付き
1. csv&text形式でのダウンロード可能
1. csvファイルによってデータ引き継ぎを行うため、ios ⇄ Android間の移行もできる!
1. 完全無料(バナー広告のみ)
1. 最低限の機能しか

Firebase Firestore Flutterでの環境設定

`Firebase`のプロジェクトを作成したら、[Firebaseコンソール](https://console.firebase.google.com/?hl=ja)で`Cloud Firestore`に移動し、ワークフローに従って開始モードの選択(`テストモード`or`ロックモード`)→[ロケーションの設定](https://firebase.google.com/docs/firestore/locations?hl=ja#types)→`完了ボタン`の順に進めて頂いたら、

**1.**[FlutterとFirebaseの初期化と紐付け](https://qiita.com/ume-bar/items/fb5162b21d95e0c0bc42)
**2.プラグインのインストール**
“`
flutter pub add cloud_firestore
“`
**3.`flutter run`で再ビルド**
**4.`CocoaPods`が`1.9.1`以降にアップグレードされているか確認。**
“`
gem install cocoapods
“`
**5.**[パッケー

PWA(Progressive Web Apps)とは -Qiitaをスマホで快適に見る-

## QiitaをiPhoneで快適に見たい
1. でも公式アプリってないよね?
1. とりあえずホーム画面に追加するか…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882988/7832dae2-6e7d-f6df-bda1-1b16d05adb48.png)
1. で、生成されたこれを押す。
![S__70516744.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882988/5e1e897f-ecd6-4c39-1c3a-7f789015bf0b.jpeg)
1. するとSafariで開かれず、アドレスバーも何もないネイティブアプリのような画面で表示される。
![S__70516740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882988/e34c7afe-9f89-c31f-965b-2214c7

AndroidエンジニアのためのiOSライブラリ選定シート

Qiita初投稿です!:joy:

## 目的
本ページはAndroidアプリ開発経験者がiOSアプリを開発し始める上で必ず確認したくなる~~はずの~~**Androidでいうとこのライブラリなんだけど、それのiOS版は何か**をまとめたものです。主に自分で調べた備忘録として残します。
誰かの労力の削減になれば幸いです:open_hands:

## 比較表(2022/9/30 時点)
| 役割 | Android(kotlin) | iOS(Swift) |
|:-:|:-:|:-:|
| ログ | [Timber](https://github.com/JakeWharton/timber) | [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver) |
| HTTP クライアント | [Retrofit2](https://square.github.io/retrofit/) | [Moya](https://github.com/Moya/Moya)※1 |
| 画像読み込み | [coil](https://

【Swift】guard letについて改めて復習

## guard letの利点
– 早期リターン(さっさと処理を抜けたい時に使える)

## 使い方

サンプルコード1
定数(変数)のnilチェック

“` swift
let soga = nil

guard let soga = soga else {
// nilの場合はreturn
return
}
“`

サンプルコード2
定数(変数)のnilチェック(複数版)

“` swift
let soga1 = nil
let soga2 = nil

guard let soga1 = soga1,
let soga2 = soga2, else {
// soga1がnilの場合、soga2の判定をせずにreturn
return
}
“`

サンプルコード3
定数(変数)の値の比較

“` swift
let soga1 = nil
let soga2 = nil

guard soga1 == soga2 else {
// soga1とsoga2が同じでなければreturn
return
}
“`