- 1. bundler: failed to load command: pod が出た場合の対応
- 2. PyTorchのモデルをiOSで利用する – LibTorchをiOSプロジェクトに組み込む手順
- 3. AnimeGANv2をCore MLに変換してiOSでつかう【変換済みモデルあり】
- 4. 【入門】iOS アプリ開発 #2【SpriteKit を使う】
- 5. WWDC2020での許諾周りのアップデートまとめ
- 6. ターミナル、要らないのかな【Xcode, iOS】
- 7. 【Swift】オプショナル束縛構文の使い方
- 8. [SwiftUI]R.swiftを使えるようにする
- 9. FlutterでAndroidビルドのみ失敗するようになる場合の対処法
- 10. Udemyのswiftコース(英語のやつ)でiOSアプリ開発を学ぶ その4
- 11. 【入門】iOS アプリ開発 #1
- 12. Flutter の iOS 向けビルドでハマったメモ
- 13. [SwiftUI]EnvironmentObjectの罠
- 14. 不要になったUserDefaultsキーの管理方法
- 15. 【Swift】deinitではwillSet/didSetが呼ばれないというお話
- 16. Functionに関して、まとめた。【Swift】
- 17. [SwiftUI]EnvironmentObjectとBinding
- 18. Immutable value “number” was never used;
- 19. 自作ライブラリ Carthage CocoaPods 公開を CI で自動化
- 20. iOS13 で UILabel のスタイルが間違えて表示されている可能性がある
bundler: failed to load command: pod が出た場合の対応
Xcodeのバージョンを新しくした後にcocoapodsを更新しようとターミナルで
“`sh
bundle exec pod install
“`を叩いた時にエラーが発生
“`sh
$ bundle exec pod installbundler: failed to load command: pod (/Users/tamappe/Documents/workspace/iOS/App/vendor/bundle/ruby/2.3.0/bin/pod) RuntimeError: Failed to extract git version from `git –version` (“xcrun: error: active developer path (\”/Applications/Xcode_11.app/Contents/Developer\”) does not exist\nUse `sudo xcode-select –switch path/to/Xcode.app` to specify the Xcode that you wish to us
PyTorchのモデルをiOSで利用する – LibTorchをiOSプロジェクトに組み込む手順
PyTorchで作成した**.ptモデルをiOSで直接(Core MLモデルに変換せずに)使う**方法。
MetalやNeural Engineに最適化されることが期待されるので**基本的にはCore MLに変換してから使ったほうが良い**のだが、
– PyTorchモデルをCore ML Toolsで変換するにはいったんONNXフォーマットに変換するといった煩雑さがある[^tool4]
– PyTorchモデルをAndroidと共通で使いたい[^tool4]: coremltools 4.0から直接Core MLモデルに変換できるようになったが、まだベータなのと、ちょっと使ってみた感じでは生成されるモデルがiOS 14以上でしか使用できない
こういった場合にそのまま直接組み込むという線も出てくる。
PyTorchモデルを扱うC++ライブラリがCocoaPods対応してるので、自分のアプリへの導入はめちゃくちゃ簡単。
以下その手順。
## 1. LibTorchのインストール
`Podfile`に以下を追記して、
“`
pod ‘LibTorch’, ‘~>1.
AnimeGANv2をCore MLに変換してiOSでつかう【変換済みモデルあり】
[変換済みモデル(Hayao,Paprika)GitHubリンク![anime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8a3446ed-eee0-4d56-0340-2f7dda83efbd.gif)
](https://github.com/john-rocky/CoreML-Models./blob/master/README.md)**8.6MBの軽量モデル。**
グラフをpbtxt形式で保存します。
“`python:test.py
tf.train.write_graph(sess.graph_def, ‘./’, ‘animegan.pbtxt’)
“`アウトプットノードの名前を調べます。
“`python:test.py
graph = sess.graph
print([node.name for node in graph.as_graph_def().node])
“`凍結グラフを作ります。
“`python
from tens
【入門】iOS アプリ開発 #2【SpriteKit を使う】
# SpriteKit
iOS向けの2Dゲーム開発用として、SpriteKit というフレームワークが提供されている。
今回、古典的なピクセルアートのゲーム「パックマン」を作るため、スプライトのキャラクタをもっと簡単に扱えるようにしたい。
キャラクタは基本 16×16ドットで構成されており、テクスチャの切り替えアニメーションも考慮すると、オブジェクトで管理するのは大変そう。
そのため1つの大きなアセット画像を 16×16ドットで切り出して、テクスチャ番号で扱えるようにする。
スプライトもオブジェクト管理ではなく、スプライト管理番号で扱えるようなクラスを作成する。
# Sprite Manager class の作成
スプライトを表示する API はシンプルに、
“`swift
draw(0, x:100, y:50, texture:1)
“`とする。
また一定間隔(0.1s)でアニメーションする API は、
“`swift
startAnimation(0, sequence: [1,2,3], timePerFrame: 0.1, repe
WWDC2020での許諾周りのアップデートまとめ
# 概要
今年はプライバシー、権限周りで多くのアップデートがあったのでまとめてみます。
この記事は以下のWWDC 2020セッション動画、及び公式ドキュメントを元に書いています(ここで出てくるスクショも動画のものです)。
周辺知識も含めて深く知りたい方はご参考までに。* [Build trust through better privacy](https://developer.apple.com/videos/play/wwdc2020/10676/)
* [Meet Nearby Interaction](https://developer.apple.com/videos/play/wwdc2020/10668)
* [Design for location privacy](https://developer.apple.com/videos/play/wwdc2020/10162)
* [What’s new in location](https://developer.apple.com/videos/play/wwdc2020/10660/)
* [Handle
ターミナル、要らないのかな【Xcode, iOS】
今日学んだGit情報を、Outputするだけの簡素な投稿。?
今後Gitを学ぶときの為の、自分用リンクとかも貼る。## ターミナル、要らないのかな。
先程、こちらの記事を読みました。
[**Xcode9時代のゆるふわGitHub生活**]
(https://qiita.com/touyoubuntu/items/e87a47e880c0fa80cbdc#%E3%81%BE%E3%81%A8%E3%82%81)先日こんな記事を書いたけど、やはりコマンドは要らないのかな。
[**GitHub奮闘記②【手順まとめ】**]
(https://qiita.com/kazuki_user/items/59c610d30d9595496242)でも、iOS以外の場合や、Xcode内の Git機能でも出来ないこともある場合を考えると、
コマンドは依然必要だったりするのでしょうか。ご意見あればコメントください。
## 鍵作成。
リモートリポジトリへのアクセス権限がなく失敗したので、鍵作成しました。
とても簡単に出来た。?“`
Permission denied (publicke
【Swift】オプショナル束縛構文の使い方
###1.はじめに
—
前回オプショナル型の基本についての記事を書きましたが、今回はオプショナル型を実装するうえで、コードを読みやすく、スマートに書くことができる、オプショナル束縛構文について解説しようと思います。
前回の記事はこちらです。
(https://qiita.com/0901_yasyun/items/d64986bdfe917d90382c)###2.オプショナル束縛構文とは
—
まず以下のif文の条件を見てください。“`swift:
let year : Int? = Int(“2000”)
if let y = year { //ここのif文の書き方に注目
print(“ハレー彗星は\(y + 61)年に来る”)
}else{
print(“エラー”)
}
“`この条件の書き方は、if文とwhile文の条件部にのみ記述することができる、特別な構文です。これを**オプショナル構文**、または**if-let文**と呼びます。
このコードだと、もし変数yearがnilではない値を持っていたら、if文の条件判定は真と
[SwiftUI]R.swiftを使えるようにする
[R.swift](https://github.com/mac-cain13/R.swift)ではまだSwiftUIに対応していないのですが、本家issueに対策があったので書いてみました。
実際に使ってみたところ、かなり快適です。“`swift
import Rswift
import SwiftUIextension FontResource {
func font(size: CGFloat) -> Font {
Font.custom(fontName, size: size)
}
}extension ColorResource {
var color: Color {
Color(name)
}
}extension StringResource {
var localizedStringKey: LocalizedStringKey {
LocalizedStringKey(key)
}var text: Text {
Te
FlutterでAndroidビルドのみ失敗するようになる場合の対処法
# 現象
Androidでデバッグビルドしてデバッグ実行していたのに、突然ビルドが出来なくなることがある。
エラーは私の場合、firebase_analytics:webの依存関係が解決できない的なメッセージ。“`console
FAILURE: Build failed with an exception.* What went wrong:
Could not determine the dependencies of task ‘:firebase_analytics:compileDebugAidl’.
> Could not resolve all task dependencies for configuration ‘:firebase_analytics:debugCompileClasspath’.
> Could not resolve project :firebase_analytics_web.
Required by:
project :firebase_analytics
> Unable to f
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 parametersfunc 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;
## たまに見るやつ。
たまに見る警告。そして、自然と消えるやつ。⚠️
いちいち投稿するまでも無いかもだけど、一応まとめておきます。## 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` はどちらか一方の値が変わるともう一方の値も変わるという連動性があることから(下記ドキュメント