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

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

Udemyのswiftコース(英語のやつ)でiOSアプリ開発を学ぶ その4

勉強するコースはこれです:point_down:
https://www.udemy.com/course/ios-13-app-development-bootcamp/

##進捗
セクション4の途中まで終了(全部で36セクション)(ひとまずベイビーステップですよね)
サイコロのアプリを作りつつ、その中で変数(variables)と配列(arrays)について学習した。

##感想
配列や変数の基礎については知っているつもりだけど、良いおさらいでした:man_tone1:
今まで自分がしてきた学習は日本語での本や授業の内容だったので、英語で学ぶとまた新鮮な部分がありますね。
「英語だとこう言うのか!」とか「英語だったらこういう風に解説すればいいのか!」とか目から鱗な内容もありました。
すでにswiftに詳しい人でも受講すると英語の勉強になっていいかも。
また、英単語や英語での表現に詳しければ英語で内容を調べやすいので、開発中に分からないところでつまづいたときにこの学習経験が役に立ちそうな気がする。

ジョークは、Angela先生から昇給(a raise)と配列(arrays)をかけ

元記事を表示

【入門】iOS アプリ開発 #1

#はじめに
新型コロナウィルス(COVID-19)の影響により、外出自粛が続いている。
どこへも出かけない夏休み、この機会に Mac を購入して iOS のプログラミングを勉強してみようと思う。
iPhone のアプリは Swift という言語で作られるようだ。

アップルは Swift を「モダン、安全、高速、インタラクティブ」を特徴として謳っている。
これだけでは全くイメージつかないが、さぞかし簡単にアプリが開発できるに違いない。

昔のゲームぐらいならば、さくっと作れて、軽快にサクサク動作するのであろう。
さらにタッチパネルやセンサーで操作できると面白そうだ。

プログラミングすることよりも、何を作るか?どんな仕様するか?、企画や上流設計は悩みどころだ。
またキャラクターのデザインやサウンドなどを作るのも骨が折れる。

色々調べてみるとパックマンの仕様書が公開されている。
これをもとに作ればプログラミングに専念できそうだ。

#パックマンのゲーム仕様書
下記の人工知能学会誌に仕様書が公開されている。

– [人工知能学会誌 Vol.34 No.1 (2019/1)](https:

元記事を表示

Flutter の iOS 向けビルドでハマったメモ

# Flutter の iOS 向けビルド備忘録

とりあえず解決したことを列挙するだけの備忘録

## Undefined symbols for architecture arm64

`Create Bridging Header` で解決した

* [Why linker link static libraries with errors? iOS](https://stackoverflow.com/questions/52536380/why-linker-link-static-libraries-with-errors-ios)
* [Error when ‘flutter run’: Undefined symbols for architecture arm64: #41900](https://github.com/flutter/flutter/issues/41900)
* [Flutter Pluginの利用でSwiftエラーが出る場合の対処方法](https://qiita.com/ko2ic/items/f082f07df8a2aca6beed)

##

元記事を表示

[SwiftUI]EnvironmentObjectの罠

`EnvironmentObject`を使っていたところ、以下のようなエラーに遭遇しました。

“`
Fatal error: No ObservableObject of type **** found.
A View.environmentObject(_:) for * may be missing as an ancestor of this view.
“`

これは、直前に

“`swift

}
.sheet(isPresented: $isPresented) {
ModalView(showingModal: self.$isPresented)
}

“`

という操作を行っていました。ModalViewの中では呼び出し元と同じ`EnvironmentObject`を宣言していました。

## 原因

こちらを参考にしました。

https://stackoverflow.com/questions/58743004/swiftui-environmentobject-error-may-be-missing-as-an-ancestor-of-t

元記事を表示

不要になったUserDefaultsキーの管理方法

## UserDefaultsについて
「ある画面を表示したかどうか」などの情報をアプリに保存する場合、UserDefaultsを利用する機会が多いと思います。
UserDefaultsを利用して値を保存することに目を向けがちですが、アプリ開発では機能追加だけでなく、利用しなくなった機能を削除することももちろんあります。
その際に機能を削除する際に不要となるUserDefaultsのキーを適切に扱わなければ、同一のキーを利用して意図しない動作につながってしまうケースがあります

この記事では既存の不要となったキーの管理方法についてまとめ、新しい管理方法についてまとめたものとなります。

## 既存の管理方法
### 1. キーごと削除する
不要となったキーを削除するパターンです。もし別の機能開発で全く同じキー名が利用されるケースがあった場合、未然に防ぐことができなくなるためあまりおすすめはできません。

### 2. prefix / suffix
利用していないキー名にprefixやsuffixを加えることで管理するパターンです。
利用されていないキーが明示的にはなりますが、キー名が

元記事を表示

【Swift】deinitではwillSet/didSetが呼ばれないというお話

# 結論

init/deinit内でプロパティに代入を行っても、willSet/didSetは呼ばれないので注意しましょう。
ただし、スーパークラスのプロパティのwillSet/didSetは呼ばれるようです。

# 公式ガイドの注意書き

公式ガイド(The Swift Programming LanguageのProperties)に、以下のような注意書きがあります。

>NOTE
The willSet and didSet observers of superclass properties are called when a property is set in a subclass initializer, after the superclass initializer has been called. They are not called while a class is setting its own properties, before the superclass initializer has been called.[^1]

[^1]: [The Sw

元記事を表示

Functionに関して、まとめた。【Swift】

## Functionの初歩。

func(関数)を学んだので、簡単におさらい。

### Functionを何故使うのか。

amazonのような買い物アプリにて、
ユーザーの買い物カゴの合計金額を計算する箇所が5つあるとき、

– `5箇所で同じコードを書くのは無駄。`
– `コード量が増えて、プログラム自体が複雑で読みにくくなる。`

**処理が1回しかないもの**でも、functionには利点あり。

– `functionにしてマトめる`と、コード量がかなり多いとき読みやすい。
– `function名`を適切につけて、判別しやすい。

### パラメータと引数の違い
> 意思疎通にはそれほど困らないけど・・・
「引数 == パラメータ」ではない

– **パラメータ** (**仮引数**)は、関数に受け渡されるものの**宣言**
– **引数**は、関数に渡した実際の**値**

“`swift
// Funtion with parameters

func declare(name: String) {
print(name)
}

declare(name

元記事を表示

[SwiftUI]EnvironmentObjectとBinding

EnvironmentObjectを使って他のViewを更新しようとしましたが中々できなく、数時間ハマってしまいました。
解決方法を見つけたので書いてみました。

### どのような場合か

親View・子View・もう一つのViewの構成で、もう一つのViewから子Viewを更新したい時。

### 始めにやっていたこと

– 親View:EnvironmentObjectを持つ
– 子View:Stateを持つ
– もう一つのView:EnvironmentObject
– EnvironmentObjectとして`ObservableObject`を継承したクラスを使っていた

→もう一つのViewで値を変更しても、子Viewの値が更新されませんでした

### 解決策

– 親View:EnvironmentObjectを持つ
– 子View:Bindingを持つ
– もう一つのView:EnvironmentObject
– EnvironmentObjectとして`ObservableObject`を継承したクラス

→子ViewのStateを`Binding`に変更しまし

元記事を表示

Immutable value “number” was never used; consider replacing with “_” or removing it

## たまに見るやつ。

たまに見る警告。そして、自然と消えるやつ。⚠️
いちいち投稿するまでも無いかもだけど、一応まとめておきます。

## Immutable value “number” was never used;

`for`構文とかで、まだ中身書いてない時に、
一時的に発生する警告。

“`swift
Immutable value “number” was never used; consider replacing with “_” or removing it
“`

“`swift
for number in 0…4 { // Immutable value “number” was never used; consider replacing with “_” or removing it
// まだ中身書いてない。
}
“`

「”number”は**使われてない**から、”**_**”に置き換える、もしくは**削除**することも考え直したらどう?」

と、言われています。

### 「 _ 」 とは?
`「その値は使用しない」` という意

元記事を表示

自作ライブラリ Carthage CocoaPods 公開を CI で自動化

GitHub Actions を利用し、Release 作成タイミングで、ライブラリ公開作業を自動化しましょう!

# 前提

– `Release` の作成 (= `tag` 作成) は手作業で行うものとします。
この記事で行う自動化は、Release 作成をトリガーとして行うものです。

– https://github.com/yuki0n0/WaveSlider/
解説するものは、こちらのライブラリを作成したときの情報に基づいています。
よかったら GitHub で **Star ★** つけてね。

– https://qiita.com/yuki0n0/items/290c6ab753634e7395f5
ライブラリ公開の手続きなどはこちらで解説しております。

– CI は GitHub Actions を利用しています。
大したことはやってないのでお好きな CI で読み替えてください

# CocoaPods

今回やることは下記です。

– `pod trunk push` を CI で自動的に実行

元記事を表示

iOS13 で UILabel のスタイルが間違えて表示されている可能性がある

### 起きたこと

UILabel の `attributedText` を nil (リセット) にしてもラベルのスタイルが変わらないという現象が発生していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/2e9a89b3-6880-1951-1262-7507cb8e308a.png)

### TL;DR

#### 原因

UILabel の attributedText の値が nil(リセット)になった場合、通常(iOS12以前)は Label の attributes もリセットされるが iOS13 ではリセットされないとの[報告](https://developer.apple.com/forums/thread/121366)があり、それが起因して考えられます。

#### 解決策

UILabel の `text`・`attributedText` はどちらか一方の値が変わるともう一方の値も変わるという連動性があることから(下記ドキュメント

元記事を表示

Swift でアプリ内アイテムフィルタリングを実現する話

# 前書き
こんにちは、リビリンです。日本語も記事書きも初心者です。

この記事はジェネリックタイプと関数型プログラミングのテクニックを使ってフィルタリングを実現する方法を紹介します。読むには、Swift の[ジェネリックタイプ](https://docs.swift.org/swift-book/LanguageGuide/Generics.html#ID189)と、ちょっとした関数型プログランミングの概念が必要です(といっても`filter`と`sorter`のような高階関数とクロージャが理解していれば大丈夫です)。

# 背景
自作アプリの[「‎デレガイド2」](https://apps.apple.com/us/app/%E3%83%87%E3%83%AC%E3%82%AC%E3%82%A4%E3%83%89-2-for-%E3%83%87%E3%83%AC%E3%82%B9%E3%83%86/id1493630000)は、アイドルリズムゲーム[「アイドルマスター シンデレラガールズ スターライトステージ(デレステ)」](https://cinderella.idolmaste

元記事を表示

Dart vs Swift

| 作者 : Andrea Bizzotto
| 原文 : [medium](https://medium.com/coding-with-flutter/dart-vs-swift-a-comparison-6491e945dc17)
| 翻訳 : [jamestong](https://qiita.com/jamestong)
| 校正 : [jamestong](https://qiita.com/jamestong)

DartとSwiftは私のお気に入りの2つのプログラミング言語です。私は商用およびオープンソースのコードでこれらを幅広く使用してきました。

この記事では、DartとSwiftを並べて比較してみます。

– 両者の違いを強調する;
– 開発者の参考として、一方の言語から他方の言語に移行する(または両方を使用する)時の注意点を挙げる。

背景:

– Dartは、単一のコードベースから美しいネイティブアプリを構築するためのGoogleのフレームワークであるFlutterに対応している;
– Swiftは、iOS、macOS、tvOS、watchOSにまたがるAp

元記事を表示

実践・新規モバイルアプリ開発の手順(iOS)

久しぶりに新規アプリ開発をしていて、改めて手順を確認しました。

## 前提

実際の開発では多くの場合、要件定義、設計、API開発、デザインがある程度並行で走るため、仕様がフワフワした状態で着手することが多いです。
その際にどのように立ち回るのがよいか。また、複数人で開発する場合にどのように作業分担するか書いてきます。
なお、設計方針はオーソドックスなMVCで、アプリの構成は一般的なAPI通信をするサービス系アプリと想定します。
設計方針やアプリの構成が異なる場合は読み替えてください。

このフローは何案件かで新規開発を行った人であれば頭の中で構築しているのでしょうけど、言語化されてるのはあまり見かけません。

## 利用方法

– どういうタスクが存在するか確認
– 今の状態でできることは何かを見つける
– 今やってるタスクの意味を理解する
– 今やってるタスクが他のタスクとどう繋がっているか確認する
– 残タスクに対して何の資料や仕様か、何がブロック要因なのか確認する
– 進捗の目処を立てる

## iOSアプリの新規開発フロー

既に仕様が全て揃っている状態からスタートする場合

元記事を表示

【Swift】バックグラウンド的な処理をタイマーで実装してみた

どうも、ねこきち(@nekokichi1_yos2)です。

Swiftにはバックグラウンド処理を実装する方法はありますが、
・**特定の用途に限定**
・**汎用的な方法もあるが短時間**
・**長時間の方法はAppleが推奨してない**
・**処理が安定しない**
の理由で扱いが難しいです。

しかし、簡単な処理ならば、バックグラウンド処理のメソッドを使用しなくても、バックグラウンドは実現できます。

**そこで、デリゲートを使って、バックグラウンドに対応したタイマーを実装します。**

## 解説

実装する機能は、
・タイマー
・バックグラウンドとのやりとり
・デリゲート
の3つ。

処理の流れは、下記の通り。
1. ボタン押下
2. タイマー起動
3. バックグラウンドに移行
4. アプリ画面に復帰
5. バックグラウンドでの経過時間を残り時間から引く
6. タイマー終了

使用するのは、
– backgroundTimer.swift
– SceneDelega

元記事を表示

【Flutter】Pigeon を使ってネイティブコードを型安全に呼ぶ

## はじめに
先日の、 [ Flutter 1.20 のリリース記事 ](https://medium.com/flutter/announcing-flutter-1-20-2aaf68c89c75)で、[ Pigeon ](https://pub.dev/packages/pigeon) というパッケージの紹介がありました。
本来 Flutter 側からネイティブコードを呼ぶには、関数名や引数などを文字列ベースで合わせる必要があるなど、少し大変ですが、このパッケージを使うことで、

* ネイティブ側と__型安全に通信__
* 自動生成よる__手書きコード量の削減__

が可能になります。

本投稿では、このパッケージを使って、__swift / Kotlin で実装した単純な add メソッド__を Flutter 側 から呼ぶ方法を見ていきます。サンプルプロジェクトは[こちら](https://github.com/nskhei/flutter_pigeon_practice)で公開しています。

## Pigeon が行うこと
Dart 側で定義した、引数や戻り値の情報を

元記事を表示

Swiftで画像を丸くする方法(かんたん!)

imageViewのレイヤーのcornerRadiusというプロパティにviewの横幅の半分の値をセットすると、きれいな円になってくれます。

“`swift
sampleImage.layer.cornerRadius = sampleImage.frame.width / 2.0
“`

![IMG_4346.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455240/403dfb11-493b-90c9-405b-4342b177e251.jpeg)

# 参考文献
– https://developer.apple.com/documentation/quartzcore/calayer/1410818-cornerradius

元記事を表示

GitHub奮闘記②【手順まとめ】

## ㊗︎ 初 push

用語に続いて、この勢いで 手順もまとめます。
[**GitHub**](https://github.com/)のユーザー登録は済ませて下さい。

## 手順

### 0.最終的に、こんな感じ。

「GitTestProject」というリポジトリ名。
`initial Commit`に加えて、追加したCommitが反映されています。

push出来てた!.png

### 1. gitの初期設定?
Gitに**「ユーザ名」「メールアドレス」**を登録します。
GitHubと同じものを指定しておくのが良いです。

以下のコードを元に、ターミナルで設定します。(1行ずつ)

“`swift
git config –global user.name “ユーザー名”
“`

“`

元記事を表示

GitHub奮闘記①【用語まとめ】

## ㊗︎ 初 push

先日まで push が出来なかったのですが、

**gitの初期設定**をしていなかった事が原因でした。
以下のコードを元に、ターミナルで設定します。(1行ずつ)

“`ruby
git config –global user.name “ユーザー名”
“`

“`ruby
git config –global user.email メールアドレス
“`

####ターミナル ?

Xcode内にターミナルは無いですが、**Macに標準インストール**されてます。
`Finder -> アプリケーション -> ユーティリティ -> ターミナル`

## 用語

#### 「リポジトリ」 (repository)
- **ソースコードを管理**する単位。
-「**保管場所**」をカッコ付けて言った表現。
-「ローカル」と「リモート」 がある。
- ローカルリポジトリで作業を行い、その作業内容をリモートリポジトリへpush。
- 
[**今さら聞けない!GitHubの使い方【超初心者向け】**]
(https://techacademy.jp/

元記事を表示

[Swift勉強会] カウントアップアプリを改造して,通知をn秒後に通知を出してみる (n>0)

# 前回までの内容
カウントアップアプリの作成までは[こちら](https://qiita.com/appgrape/private/ead85f5267d4d7894084)
作:https://qiita.com/appgrape

#今回のゴール
– 通知の基本文法がわかる
– UISwitchの基本的な使い方がわかる
– Switchをオンにした時に通知される
– アプリ内で通知が来る
– カウントアップで指定した数秒後に通知が出せる

# 完成アプリ
完成品が[こちら](https://github.com/techiro/CountUpAppForBeginners/tree/v2)になります
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230705/ef4e863a-0761-f72b-e125-5948be2b118e.gif)

# アプリの実装

## UISwitchの実装
### UIの実装
前回まで

元記事を表示

OTHERカテゴリの最新記事