-
ReactiveXの処理が図で分かる「RxMarbles」
Friday, March 4, 2016
Twitterでフォローさせて頂いている人のつぶやきで知ったのですが、ReactiveX(RxSwift)の、 map, flatMap, cancat などといった関数の使い方と、それが図で見れるアプリを知ったのでそのアプリの紹介をしてみようと思います。 AnjLab「RxMarbles」 …
-
try! Swift2日目でrx_reachedBottomが気になったので作ってみた
Thursday, March 3, 2016
相変わらず、有志の方が書き起こしてくださっているブログやハッシュタグから情報を取り寄せています。どうも。 その中で、 ishkawa さんが発表したスライドの中に、rx_reachedBottomなるものが出てきて、調べてみたらどうやらRxSwiftで用意されているものじゃなかったっぽいので、予想して書いてみました。 執筆時点ではまだサンプルコードが公開されていないので、あくまでも予測なので、正式(?)なものが公開されたら追記します。 注意 ishkawaさんがサンプルプロジェクトを公開していたので確認したところ、 見事に 予想が外れたので、自分の駄作を残しつつ、追記します。 …
-
少しずつ変えていく
Wednesday, March 2, 2016
今日はtry!Swiftで渋谷は賑わっているようですね。私は諸事情で行けなかったですが……。 ベースにさせて頂いたブログのテーマを少しずつ改良しています。 なんとなく、飽きてきてしまうんですよね 今回は、まだまだpvが少ないにも拘らず、調子にのってSNSシェアボタンのレイアウトと配置を変えさせてもらいました。 参考はてなブログのシェア数付きソーシャルボタンカスタマイズでフラットボタンのコピペコードを追加です。(vol2) はてなブログ用だったので、一部Hugoでも使えるように書き換えさせて頂きました。感謝感謝。
-
【書評】Swift+Core DataによるiOSアプリプログラミング
Monday, February 29, 2016
今回は、タイトルの通り、西方夏子さんが書かれた「Swift+Core DataによるiOSアプリプログラミング」を拝読させていただいた感想を書かせていただこうと思います。 はじめに 今回この記事を書くに至った経緯としましては、マイナビブックスさんにて、読者モニター募集のキャンペーンをやっていまして、 応募させて頂いた所、当選したとご連絡を頂き、本の出版日の前にモニターとしてPDFを頂きました。 モニターの条件として、SNS等で感想をシェアするということでしたので、このblogに感想を書かせていただき、自分のTwitter等で拡散させていただこうと思います。 以下、拙いですが、私が読んだ書評となります。 書評 書かれているのはCoreDataのことだけじゃない まず、この本では、単にCoreDataのことについてズラズラ書いているものではなく、 UIKitの基礎から、実際にCoreDataを使う例に至るまで、 はじめてCoreDataを扱う人、ある程度入門書等を読んだ駆け出しの開発者でも理解しやすい ように書かれています。 目次を抜粋しますと、 概論 UI開発の基礎 UIKitの機能と役割 UIKitとは ビュー ビューコントローラー イベントハンドリング (省略) といった感じで、初めからガシガシCoreDataの仕組みを書くぞ!って感じというよりは、初めての人でも、本を読み進んで、サンプルプロジェクトを見ながら書き進める時の前提知識が身につくようになっています。 また、後半では、Xcode7から登場したPlaygroundに関しても触れられており、CoreDataをPlayground上で動作させることに関しても書かれています。 更に、XCTestにも触れられているので、CoreDataを使った際のテストに関しても書き方が理解できるようになっています。 読み手のこともしっかり考えているんだなと思いました。 CoreDataの事をどれだけ網羅しているか CoreDataに関しては、はじめの概論から始まり、 基本的な使い方(永続ストアのセットアップ等) データモデルの定義方法 データの追加/削除やフェッチ 自動マイグレーションとマッピング エラーの検証とハンドリング FetchedResultsControllerの使い方 効率化としてライフライクルやフェッチの応用 並列処理 iCloudでの利用 といった形で、CoreDataの基礎から応用まで、 網羅 している感じです。 特に、実際のアプリ上では非同期でフェッチしてユーザーにストレスを与えずにデータを引き出す事が重要で、 それに伴うスレッドセーフなフェッチの仕方にも触れられているので、実践的なところまでカバーしているなと思いました。 サンプルアプリを交えて章が進んでいくので、実際に作りながら、CoreDataをどう使っていくのかも学べます。 また、あまり情報のない、CoreData側での保存時のバリデーションの方法や、iCloudでの利用も記載されていて、 自分にとっても新しい発見がありました。 いままでCoreDataで定義したEntityに入る値の検証はそれ専用のValidatorクラスを作ったりして行っていましたが、それをEnitityに持たせられるのは便利だなと思いました…! また、Swiftがベースですが、SwiftとObjective-Cで少し異なるような場面では丁寧に、Objective-Cでの場合も掲載されています。 開発環境のサポートに関して 本にも記載されていますが、 Swift 2.1 Xcode 7.…
-
PDFGeneratorをv1.1.1にアップデートしました!
Sunday, February 28, 2016
先日の勉強会の間に、PDFGeneratorをv1.1.1にアップデートしました!という事後報告を。 こんなに継続して開発してるのは初めてですし、使ってくれてる人が居て、issue をくれる人がいるというのは、 本当に感謝しないとなあと思っています。 今回は1.1→1.1.1へのマイナーアップデートです。 何を修正したのか 今回は、 issue/13 の内容を修正した形になります。具体的には、 UITableView(おそらくUIScrollView,UICollectionViewでも)で、 contentInset が設定されていると、上手く描画されない (section headerとかの位置がinset分ズレたりする) といったものでした。最初普通にUITableViewControllerを作って試したものの再現できず、 contentOffset をいじっても再現できずで、 たまたま contentInset をいじったら再現が取れて、、と、再現までに時間がかかってしまいました>< どう修正したか UIScrollViewを描画する前に、一度 frame の originの値、 contentOffset の値を0にリセットをかけるので、それと併せて contentInset もリセットをかけるようにしました。 まずはこんな感じで、UIScrollViewにprivateな extension を用意して、、 private extension UIScrollView { typealias TempInfo = (frame: CGRect, offset: CGPoint, inset: UIEdgeInsets) var tempInfo: TempInfo { return (self.frame,self.contentOffset,self.contentInset) } func resetInfoForRender() { self.contentOffset = CGPointZero self.contentInset = UIEdgeInsetsZero self.frame = CGRect(origin: CGPointZero, size: self.…
-
無事1000pvを超えました!
Sunday, February 28, 2016
どうやらウィルス性胃腸炎をもらってきた節が濃厚になってきて、お腹が悲鳴を上げています。どうもです。 このブログをなんとなく初めて1ヶ月弱経ちましたが、なんとか1000pvを越えることができました! まだまだ記事数も少ないし、読み手が有益になるような情報を発信できているかと言うとまだまだだと思いますが、 引き続き頑張ってまいりますのでどうぞ宜しくお願いします。 今後もとりあえずは1000刻みずつを目標にして更新を頑張っていけたらと思います。
-
第25回 iOS馬場 に参加してきました
Saturday, February 27, 2016
実は、こういった勉強会に参加するのは初めてでした。どうもです。 初めて参加させていただきましたが、もくもく会をベースにということで、みなさん各々もくもくとやったり、 雑談があったりと、勉強会は過ごさせていただき、その後の懇親会では、情報交換をしたりと、とても有意義な時間になりました! …
-
enumの要素を配列で取得したい
Friday, February 26, 2016
enumの要素の数や、全ての要素を配列として受け取りたい時に、 enum SomeType { case A, B, C, D var cases: [SomeType] { return [.A, .B, .C, .D] } var count: Int { return cases.count } } みたいなことをしたくなかったので、なんとかprotocolとかでこのあたりうまーくやれないかなと思って四苦八苦した結果キレイにまとめられた(と個人的には思っている)ので、公開しておきます。 …
-
ErrorTypeを拡張してより使いやすく
Friday, February 26, 2016
Swift2.0からErrorTypeが登場し、enum等に適応させることでエラーの種類を簡単に実装できるようになりました。 enum SomeErrors: ErrorType { case ErrorA case ErrorB case ErrorC(String) } func doSomething() throws { throw SomeErrors.ErrorA } //----- (A) do { try doSomething() } catch let error { print(error) } //------ (B) do { try doSomething() } catch SomeErrors.ErrorA { print("error!") } catch SomeErrors.ErrorC(let msg) { print("error! \(msg)") } といった感じでdo~try~catchでエラーをキャッチしたときにその内容をprintできたり(A)、パターンマッチで特定のエラーをキャッチする(B)が簡単に行なえます。 また、よくあるResult型などで失敗時にErrorTypeを突っ込むことができたりします。 (B)のようにパターンマッチで条件を分けたい場合だけなら問題ないのですが、(A)のようにエラーの内容をprintしようと思うとちょっと困ったことがあります。 …
-
Travisでcarthageを使う場合
Thursday, February 25, 2016
travis ciを使って、CarthageのビルドチェックやReleaseにframework.zipを貼り付ける場合に、 before_install: - brew update - brew install carthage といった感じに書くのですが、どうやら最近のtravis ciのbrew上には最初からCarthageが入っているらしく、 brew install carthageのところでコケてしまいます。 なので、brew install carthage を削除すればいい…のですが、必ずしもcarthageのバージョンが最新とも限らないので、以下のようにして、最新のものを使うようにします、 before_install: - brew update - brew unlink carthage - brew install carthage 一度unlinkすれば、新しい物をダウンロードできるようです。