Swift学習日記

# はじめに
最近Swiftを学ぶのに様々なQiita記事やブログ記事を読んだりするのですが、それらの情報が散漫としてしまって全然後から見返せないなということで備忘録的なことも兼ねてその日の学んだことを日記調にまとめてみようと思いました。
セクションは日付で区切ろうと思いますが、後からの検索しやすさも考えて目次は項目別に作りたいと思うので是非参考にしてみてください。

また、基本的に今までQiita記事にまとめてきたことや、これは一つの記事にすべきだと思われる最新情報などは基本的にリンクのみに止めようと思います。

あわせてどうぞ⇒[Swiftのライブラリやサードパーティ製ツールへのリンクまとめ（随時更新中）](http://qiita.com/touyoubuntu/items/052588f5f3e55e02c2f2)
アプリ四本リリース中です⇒[AppStore](https://itunes.apple.com/jp/developer/yosuke-fujii/id1089595725?l=ja)

## 目次
- iOS開発
	- [初めてのオリジナルiPhoneアプリをつくるまで](http://qiita.com/touyoubuntu/items/ea7b42e00050083bd2ff)
	- UIKit
		- [UIPageViewControllerを使ってみる](http://qiita.com/touyoubuntu/items/9a9e6aad1204d82b7b61)
	- 広告
		- [2016/05/27-GoogleMobileAds](#2016/05/27-GoogleMobileAds)
- コーディング
	- 文法
		- [Swift2.2になって非推奨になった文法と推奨コードまとめ](http://qiita.com/touyoubuntu/items/7e902867e5bcfde13666)
		- [2016/05/26-Optional型について](#2016/05/26-Optional型について)
		- [2016/07/04-様々な修飾子について](#2016/07/04-様々な修飾子について)
	- Reactive Programming
		- [ReSwiftとRealmが最高に相性がいいっていう話](http://qiita.com/touyoubuntu/items/b2316996ae886a876e82)
		- [厄介者XCTest.frameworkを使うライブラリとの戦い](http://qiita.com/touyoubuntu/items/cd8f607f7d44e03b6d9f)
- Web
	- [Swiftで書かれたWebフレームワークを試すにあたっての注意点](http://qiita.com/touyoubuntu/items/cb2bb78751a21be93bfe)
- 番外
	- [Swiftで競技プログラミング](http://qiita.com/touyoubuntu/items/1d8a9c00a283e98bc8e4)
	- [Swiftをインタープリタ型言語として扱う](http://qiita.com/touyoubuntu/items/4a5779957d58ab59a256)
	- [2016/05/29-8QueensProblemを遺伝的プログラミングで解くをSwiftで書いてみる](#2016/05/29-8QueensProblemを遺伝的プログラミングで解くをSwiftで書いてみる)
	- [2016/11/21-AdventCalendarのネタを練る一日目](#2016/11/21-AdventCalendarのネタを練る一日目)

## 2016/11/21-AdventCalendarのネタを練る一日目
久しぶりに更新しますが、iOSのアドベントカレンダーの12/5分に登録してしまったので今日からちょいちょい更新しつつアドベントカレンダーに書くネタをねっていこうというものです。
初日はとりあえずトレンドに乗っかる形で、Rxについて書いていきたいと思います。（本当のトレンドはnull安全ですが以前にも書いたのでとりあえず笑）

といっても、RxSwift自体の使い方はすでに色んな所で語られているものより目新しいことかけるほど知識は持ってませんし、今更書いてもというところもあるので今回はRx本体の実装でSwiftのあまり知られていない部分をフォーカスしていきたいと思います。

### RxSwift/RxSwift/Rx.swift
まずはこのファイルから見ていきましょう。
最初に見慣れない型名として`AtomicInt`というのがあります。これは排他処理（アトミックな処理とも言われます）に関わるInt型で、この排他処理というもの自体は簡単にいえば処理の間他のものに邪魔されないようなものを言います。その直後に`AtomicIncrement`とあるようにここで排他的にこの変数を変化させているのです。

その下には`Swift.Never`という型名があります。まず前提として`Swift.`というのは標準ライブラリの名前空間のようなもので、C++での`std::`とかJavaの`System.`と似たようなものだと思えばいいと思います。そしてこの`Never`というのはさらに辿っていくと`fatalError`の返り値の型になってますが、実際にSwiftのリポジトリで検索をかけると返り値が存在しないことを示すリテラルということがわかります。


あと意外と使わないのが`Int.max`や`Int.min`ですね。

全体としてこのファイルではRxの同期的な処理をサポートするユーティリティメソッドを実装しているようでした。
明日はObservableとかを見ていきたいと思います！

### 参考
- [Swiftでアトミック操作（排他処理）](http://qiita.com/satoshia/items/2e469fbbb7c8e4eb296e)

## 2016/07/04-様々な修飾子について
Swiftには様々な修飾子といいますか、アクセスレベルを制限するものであったりObj-Cからの機能の受け継ぎであったり、初心者は意識しなくてもいずれ意識しなければならないメモリ管理上のものであったりと、そういった文法があると思います。

中級者、さらには上級者になるにあたってそういうところを理解、知っておくというのは重要だと思ったのでリストアップしてみようかなというのが今日の趣旨です。

### とりあえずリストアップしてみよう
それぞれの細かい説明は長くなるのでどんなときに使うのかといったところを中心にリストアップしてみたいと思います。

- `weak` ... 弱参照をするときに使う。これはSwiftのメモリ管理システムの弱点（？）でもある循環参照を防ぐもので一般的にはクロージャの中の`self`や`@IBOutlet`につけることが多い。
- `unowned` ... `weak`と似たような役割。`weak`はかならずOptional型なのでインスタンスが解放されるとnilになるが、`unowned`では落ちてしまう。クロージャの`self`には基本的にこちらを使っても良い
- `final` ... クラスにつけてそのクラスが継承されないようにするもの。実際の現場では基本的に`final`は付けておき継承の必要がある時のみ外すというのがコード規約になっていることが多いらしい。
- `public` ... 最も緩いアクセスレベル修飾子。他モジュールのソースファイルからもアクセスすることができる。
- `internal` ... 標準のアクセスレベル修飾子。同じモジュールのソースファイルからならばアクセスすることができる。
- `private` ... 最も厳しい。同じソースファイル内からしかアクセスできない。他言語と違うのが同じクラスといったクラス単位ではなくソースファイル単位であるということ。よって同じソースファイルであれば違うクラスからもアクセス可能となっている。
- `private(set)` ... ゲッターやセッターのアクセスレベルはなにもしなければ対象となる定数や変数のアクセスレベルと同じになるが、このような修飾子をつけることでセッターのアクセスレベルのみを制限することができるようになる。つまり、値を知ることはできても変更は中でしかできないといったようなことができる。
- `dynamic` ... Obj-Cと同様に動的プロパティアクセスができるようになるというもの。KVO対象につけなければいけないという解説がなされることが多く、といっても難しいのでその都度チュートリアルなどで付けなければいけないタイミングを覚えるのがはやいかも...?
- `required` ... サブクラスにオーバーライドを強制したりプロトコルのイニシャライザをオーバーライドするときに使うそうです。
- `convenience` ... convenience initializerというものにつける。例がないとわかりにくいので詳しくは参考リンクをみてください。
- `@noescape` ... 関数の引数として渡すクロージャにつけると色々いいことがあるらしい。クロージャの中で`self`の循環参照を気にしなくてよくなるみたいですね。

中級から上級へと進む道のりとしてはまだまだ`didSet`と`willSet`であったりとか`associatedtype`とかあるいは`where`なんかとか色々あると思いますが、とりあえず今日の趣旨からは外れると思うのでまたいずれ調べていこうと思います。
p.s. 調べてる最中に知りましたけどdelegateって委譲って意味なんですね...


### 参考リンク

- [weak（弱参照)の使うタイミング(特にクロージャの中)について説明してみる](http://qiita.com/syou007/items/51f2342850e408739cc9)
- [【Swift】ハマりがちな循環参照について
](http://qiita.com/1234224576/items/2241266f7d307cd25ba9)
- [Swift言語を学ぶ アクセスコントロール](http://tea-leaves.jp/swift/content/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB)
- [[iOS 8][Swift] アクセス修飾子を理解する](http://dev.classmethod.jp/references/ios8-swift-access-control/)
- [ReactiveCocoa を Swift から使ってみた(2) KVO編](http://akisute.com/2015/01/reactivecocoa-swift-2-kvo.html)
- [Swiftの @noescape をもっと使おう](http://qiita.com/mishimay/items/a09c0e4a8063bf16e064)
- [[Swift] クラスのイニシャライザ５： required 修飾子
](http://qiita.com/cotrpepe/items/3931c0c20ef43f4a18ac)
- [[Swift] convenienceイニシャライザとdesignated（指定）イニシャライザ](http://qiita.com/edo_m18/items/733d8c81fb00942e3167)

## 2016/05/29-8QueensProblemを遺伝的プログラミングで解くをSwiftで書いてみる
元ネタは[遺伝的アルゴリズムでN-Queen問題の解を求める (1)](http://qiita.com/kanlkan/items/f1110b9546de567f7075)です。元の記事ではPythonで書かれていたのですが、わりとPythonとSwiftの文法が近かったことと、Pythonもやっていたことがあったというのもあって簡単に書き直せました。

最初はPlaygroundに書いていたのですが、遺伝的アルゴリズムのような実行時間の長いプログラムに関してはPlaygroundで実行するのはダメみたいですね...パソコンがブーンとかいって全然進まなかったのでREPLでコンパイルしてみたらすぐに結果が出ました（2948世代ぐらいで答えが出たので運がよかったのもありますが...）

唯一Swiftでの関数があるかどうかわからなくてPythonと書き方をちょっと変えたのが配列の最小値を求めるところです。

Arrayがモナドという先日学んだことを思い出して`reduce`を使ってみました。

```swift
let min_fitness = fitness.reduce(fitness[0]) { (n1, n2) -> Int in
    return min(n1, n2)
}
```

なんかもっと簡潔に書ける気もしますが（`{return min($0, $1)}`みたいな）、あとになって調べてみたら[Swift2 配列の最小値・最大値を求める](http://qiita.com/yasuo1981/items/28c576f66aacf00676d1)にあるようにSwift2から`minElement()`という関数が実装されてたみたいですね...笑


それじゃあ今日はここらへんで（といっても昨日からこのネタいじってましたが^^;）
大学のテスト勉強のほうを頑張りたいと思います...

## 2016/05/27-GoogleMobileAds
### 導入方法おさらい
今日はそんなにかたいことはせず自分のアプリの更新作業で広告を追加しようと思ったのですが少し忘れてしまっていたのでおさらいみたいな感じで。

まずはPod

```
pod 'Google-Mobile-Ads-SDK'
```

この時思い出しましたけどRealm ver.1.0.0、おめでとうございます。

次にStoryboardでUIViewをおいて、Classを`GADBannerView`にする

コードに

```swift
@IBOutlet var bannerView: GADBannerView!
```

を書いて関連付けて

```swift
// Google Ads
self.bannerView.adSize = kGADAdSizeSmartBannerPortrait
// for test
self.bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
self.bannerView.rootViewController = self
self.bannerView.loadRequest(GADRequest())
```

これを読み込んで完成！

### 今日みたQiita
参考リンクとかなかったので

- [[iOS]UIAlertControllerをSwiftyに扱うライブラリを書いた](http://qiita.com/Sim_progra/items/b76084c68a1a47757118)
- [【Swift】 YouTubeのAPI使って動画情報取得](http://qiita.com/komu/items/74b2e26abf26613169ea)
- [iOS/swiftで緯度・経度から2点間の距離を算出する](http://qiita.com/ymiz/items/b00c4da44070a66c8445)

## 2016/05/26-Optional型について
### Optional型というモナド
個人的にHaskellとかにも興味があって、でも挫折したたちだったので「Swiftでモナドの説明...」みたいなのをどっかの記事に見かけた時に調べてみようと思い結果ここに行き着きました。
モナドがなんたるか...については参考リンク先の解説にお任せするとして今回注目したいのは普段何気なく書いている`Int?`や`String?`などが実は`Optional<Int>`や`Optional<String>`のシンタックスシュガーでこの`Optional<T>`という型にはそれを使いやすくするための様々な関数が存在するということです。

まずなにも考えずにOptionalをつかっていると大体以下のようなコードになると思います。

```swift
var num: Int?
let x: Int = num ?? 1
let y: Int = num == nil ? 3 : 2
if let n = num {
  print("not nil")
} else {
  print("nil")
}
num = 4
let z: Int = num!
```

などなど...

大体`?`や`!`を駆使して頑張りますよね。でも実は`Optional<T>`が持つ最も強力な関数が関数型言語ではおなじみの`map`と`flatMap`なんです。参考リンクから一部抜粋させていただくとたとえばこんなことが出来ます。

```swift
var a: Int? = 2
var b: Int?
let result: Int? = a.flatMap { a0 in b.map { b0 in a0 + b0 } } // result == nil
```

普通に書こうと思うと変なところにバグを埋め込んだり、めちゃくちゃ長くなってしまいそうなものもこのようにすっきり書けてしまいます。

### Swiftで関数型
せっかくなので関数型にもちょこっと触れておくと、まずモナドの概念自体は実は標準で色々あって今日とりあげた`Optional<T>`はもちろん`Array<T>`なんかもそうだったりします。`map`や`flatMap`の他にも種類によっては`forEach`や`reduce`なども実装されているものもあるみたいです。
ライブラリとしてはFunctional Reactive ProgrammingというくらいなのでRxSwiftをはじめとして、ライブラリリンク集にもまとめてある[Swiftz](https://github.com/typelift/Swiftz)、あとはthoughtbotという会社はアプリカティブスタイルやカリー化を導入するために[Runes](https://github.com/thoughtbot/Runes)や[Curry](https://github.com/thoughtbot/Curry)などを作っています。

### まとめ
初日なのでどういう感じで書くか検討しつつという感じでしたが、とりあえず今日の分のまとめです。ここに書いてないこともありますが参考リンクの中にリンクされてる記事などからとべたりするので是非調べてみてください。

- Optionalはモナドであって`map`や`flatMap`を駆使すると便利
- `nil`は値ではない
- モナドは外界と内界を区別したもの
- クロージャじゃなくてもSwiftは高階関数をつくれたりする
- `is`とか`case`とかまだまだ使ったことないような便利文法たくさんあるっぽい

### 参考リンク
- [モナドについてSwiftで説明してみた](http://qiita.com/koher/items/12f72f2fc2db7fa709cf)
- [SwiftのOptional型を極める](http://qiita.com/koher/items/c6f446bad54442a28bf4)
- [Swiftならこう書くシリーズ 10選](https://developers.eure.jp/event/10-tips-when-moving-from-objective-c-to-swift-ja/)