はじめに
最近Swiftを学ぶのに様々なQiita記事やブログ記事を読んだりするのですが、それらの情報が散漫としてしまって全然後から見返せないなということで備忘録的なことも兼ねてその日の学んだことを日記調にまとめてみようと思いました。
セクションは日付で区切ろうと思いますが、後からの検索しやすさも考えて目次は項目別に作りたいと思うので是非参考にしてみてください。
また、基本的に今までQiita記事にまとめてきたことや、これは一つの記事にすべきだと思われる最新情報などは基本的にリンクのみに止めようと思います。
あわせてどうぞ⇒Swiftのライブラリやサードパーティ製ツールへのリンクまとめ(随時更新中)
アプリ四本リリース中です⇒AppStore
目次
- iOS開発
- コーディング
- Web
- 番外
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とかを見ていきたいと思います!
参考
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(弱参照)の使うタイミング(特にクロージャの中)について説明してみる
- 【Swift】ハマりがちな循環参照について
- Swift言語を学ぶ アクセスコントロール
- [iOS 8][Swift] アクセス修飾子を理解する
- ReactiveCocoa を Swift から使ってみた(2) KVO編
- Swiftの @noescape をもっと使おう
- [Swift] クラスのイニシャライザ5: required 修飾子
- [Swift] convenienceイニシャライザとdesignated(指定)イニシャライザ
2016/05/29-8QueensProblemを遺伝的プログラミングで解くをSwiftで書いてみる
元ネタは遺伝的アルゴリズムでN-Queen問題の解を求める (1)です。元の記事ではPythonで書かれていたのですが、わりとPythonとSwiftの文法が近かったことと、Pythonもやっていたことがあったというのもあって簡単に書き直せました。
最初はPlaygroundに書いていたのですが、遺伝的アルゴリズムのような実行時間の長いプログラムに関してはPlaygroundで実行するのはダメみたいですね...パソコンがブーンとかいって全然進まなかったのでREPLでコンパイルしてみたらすぐに結果が出ました(2948世代ぐらいで答えが出たので運がよかったのもありますが...)
唯一Swiftでの関数があるかどうかわからなくてPythonと書き方をちょっと変えたのが配列の最小値を求めるところです。
Arrayがモナドという先日学んだことを思い出してreduce
を使ってみました。
let min_fitness = fitness.reduce(fitness[0]) { (n1, n2) -> Int in
return min(n1, n2)
}
なんかもっと簡潔に書ける気もしますが({return min($0, $1)}
みたいな)、あとになって調べてみたらSwift2 配列の最小値・最大値を求めるにあるようにSwift2からminElement()
という関数が実装されてたみたいですね...笑
それじゃあ今日はここらへんで(といっても昨日からこのネタいじってましたが^^;)
大学のテスト勉強のほうを頑張りたいと思います...
2016/05/27-GoogleMobileAds
導入方法おさらい
今日はそんなにかたいことはせず自分のアプリの更新作業で広告を追加しようと思ったのですが少し忘れてしまっていたのでおさらいみたいな感じで。
まずはPod
pod 'Google-Mobile-Ads-SDK'
この時思い出しましたけどRealm ver.1.0.0、おめでとうございます。
次にStoryboardでUIViewをおいて、ClassをGADBannerView
にする
コードに
@IBOutlet var bannerView: GADBannerView!
を書いて関連付けて
// 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
参考リンクとかなかったので
2016/05/26-Optional型について
Optional型というモナド
個人的にHaskellとかにも興味があって、でも挫折したたちだったので「Swiftでモナドの説明...」みたいなのをどっかの記事に見かけた時に調べてみようと思い結果ここに行き着きました。
モナドがなんたるか...については参考リンク先の解説にお任せするとして今回注目したいのは普段何気なく書いているInt?
やString?
などが実はOptional<Int>
やOptional<String>
のシンタックスシュガーでこのOptional<T>
という型にはそれを使いやすくするための様々な関数が存在するということです。
まずなにも考えずにOptionalをつかっていると大体以下のようなコードになると思います。
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
なんです。参考リンクから一部抜粋させていただくとたとえばこんなことが出来ます。
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、あとはthoughtbotという会社はアプリカティブスタイルやカリー化を導入するためにRunesやCurryなどを作っています。
まとめ
初日なのでどういう感じで書くか検討しつつという感じでしたが、とりあえず今日の分のまとめです。ここに書いてないこともありますが参考リンクの中にリンクされてる記事などからとべたりするので是非調べてみてください。
- Optionalはモナドであって
map
やflatMap
を駆使すると便利 -
nil
は値ではない - モナドは外界と内界を区別したもの
- クロージャじゃなくてもSwiftは高階関数をつくれたりする
-
is
とかcase
とかまだまだ使ったことないような便利文法たくさんあるっぽい