おなかすいた

手当たり次第に技術で遊んだり、イラストの勉強法を模索したりしたい

ARアプリ開発経験0から頑張ってみる:1日目

この記事

大層な感じのタイトルですが、要するにですね、最近時間がちょっとあまったのでswiftを勉強し始めた雑記などしていこうかと

ちょうど完全放置してたので、こっちに学んだこととわからないことを書いていきます。

目標

ARKit3を使って色々できるようになるのがゴールです。

やること

ARKit3を使うのでiOSアプリの勉強、つまりswiftから学習していきます。マカーなのになぜか一度も触ったことなかったという

SwiftはなんでもNullつけられない

【Swift】Null安全について - Qiita

f:id:gomeifuku:20191206173208j:plain
Null安全説明

関数呼び出しの際に指定することで、処理の設計にnullかどうかを判定する部分が不要になる。

?delegateがわからない?

処理の流れが決まっているという前提で、ケースによって処理の内容をかんたんに変えたいときに使えるデザインパターン

よく3つの登場人物に分けて説明されてる - 処理(プロトコル) - 処理を任せる人 - 処理を任せられる人

[Swift]"デリゲートデザインパターン"ってなに? - Qiita

処理の流れを決めていれば(プロトコル)、処理をお願いする関数の中身を意識せずに処理を実装できる。

?クロージャがわからない?

関数のスコープにある変数を自分が定義された環境に閉じ込めるためのデータ構造

ざっくり、関数呼び出し後も変数を保持し続けるための仕組み? グローバル汚染を防ぐために使う。

でもクラスでも実装できるので、もしかしたらクラスだと実装コストが掛かるような処理を簡易的に実装するための仕様なのかもしれない

ラムダ式とかもこれで表現できてる

  • スコープに閉じられている変数をキャプチャする役割
  • かんたんに無名関数みたいなものを記述できて便利

っていうのがメリットっぽい、というか分けて考えないとなんで使うのか永遠にわからなくなりそう

【swift】イラストで分かる!具体的なClosureの使い方。 - Qiita

わかりやすい

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus) | 石川 洋資, 西山 勇世 |本 | 通販 | Amazon かった

目的
  • swiftでよく使われるデザインパターンがwebサイトとかにある説明だとイマイチわからなかった(他の人に伝えられるか不安)だったため、その補完として
  • swiftの言語仕様について網羅的にわかりそうだったため

最初の目的は現状モヤモヤするので、なるはやで理解したい コード読むときに詰まったらやればいいかなと思う

## 関数の記述 swiftでは関数を書くとき次の2つのパターンがある - funcを使った名前つき関数 - クロージャを使った無名関数 どちらを使うかはケースによって色々ある(スコープ上に同じような関数を何個も作る,処理の規模とか...)

swiftは関数も一つのオブジェクトとして扱える(ファーストクラスオブジェクト)ので、しばしば引数とかに関数を指定するようなこともあるが、関数を渡すときに各パターンの記述方法の違いをはっきり意識したほうが良さそう

funcの場合は処理の内容を{}で囲んでるが、無名関数の場合は全体を囲んでる

ちょっとめんどいな

  • num++みたいなインクリメント気泡が使えない?
  • 0それ以外をBool値として変換できない(型安全性が高いの裏返しってことかな)、 でも逆に
let optStr: String? = "hoge"
if let wrappedStr = optionalStr{
  //なんらかの処理
}

これが通るのめっちゃもにょる

トレーリングクロージャー(Trailing Closures)

関数の引数がクロージャーだった場合、引数の記述を閉じて、その後にクロージャーを別に書くことができる記法 クロージャーとそれ以外の引数というふうに分けられる場合はみやすさに繋がりそう

`````` //Trailing Closures無 numbers.reduce(0,{total, number in total + number })

//Trailing Closures有 numbers.reduce(0){ total, number in total + number } ``````

クラス内オブジェクトのアクセス

基本的にself.でアクセス可能 同スコープに同じ名前がなければ省略可能

Optional型のアンラップ

Optional型はそのままだと実際の値が取り出せない(wrap)、そのため値を使うときは、とりだせるように処理をする必要がある(unwrap)

Optional型をアンラップする4つの方法

ここにまとめてある

  1. Optional Binding
  2. Optional Chaining
  3. Forced Unwrapping
  4. ImplicitlyUnwrappedOptional型

これをみてると、null安全は勝手に安全になるというより、考慮すべきところでは考慮しなきゃいけなくて、考えなくても行けないところは何も意識しなくて済むようになる程度の仕組みっぽい?

Optional Binding

null避けにifguardが使える、僕は圧倒的にguardのほうがすき(正常時の結果を最後にかけるから)

Optional Chaining

Optional型のメンバ呼び出しするときに?.でアクセスすることで、対象の変数がnilだったときnilを返してくれる記法

Optional Bindingの方との違いは、nilだったときの処理をunwrapしてる箇所の外か中かでやるかってことなのかな。(あと、Optional型変数そのものの値を読み出したいときか)

nilだったときの処理が肥大化しなければこっちで良さそうに思える

Forced Unwrapping

Optional型のメンバアクセス時に!をつけるとnullだろうがなかろうがアクセスする

当然nullの場合はerrorになるのでデバッグ

ImplicitlyUnwrappedOptional型

Forced Unwrappingのやり方を変数宣言時にやるパターン

注意点も同様

swiftのgitignore

user関連のフォルダとかmac特有のバックアップっぽいファイルは外したほうが良さそう XcodeでiOSアプリ開発をする時の.gitignore - Qiita

swiftのライブラリ導入

CocoaPodsというRuby製のツールがあるらしく、そちらを使ってインストールするのが主流っぽい

ながれはnpmみたいな感じで設定ファイルに記述して、そのファイルに記述されたライブラリがインストールコマンド実行で入れられる(そしてimportでライブラリをモジュールとして使える)

$pod init Podfile