LoginSignup
9
8

More than 5 years have passed since last update.

Swift学習日記

Last updated at Posted at 2016-05-26

はじめに

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

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

あわせてどうぞ⇒Swiftのライブラリやサードパーティ製ツールへのリンクまとめ(随時更新中)
アプリ四本リリース中です⇒AppStore

目次

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.maxInt.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の循環参照を気にしなくてよくなるみたいですね。

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

参考リンク

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>が持つ最も強力な関数が関数型言語ではおなじみのmapflatMapなんです。参考リンクから一部抜粋させていただくとたとえばこんなことが出来ます。

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>なんかもそうだったりします。mapflatMapの他にも種類によってはforEachreduceなども実装されているものもあるみたいです。
ライブラリとしてはFunctional Reactive ProgrammingというくらいなのでRxSwiftをはじめとして、ライブラリリンク集にもまとめてあるSwiftz、あとはthoughtbotという会社はアプリカティブスタイルやカリー化を導入するためにRunesCurryなどを作っています。

まとめ

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

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

参考リンク

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8