-
enumのnamingで困った
Monday, June 20, 2016
どうせあとでやるなら…とenumのcaseの名前を lower-camel-case に書き換えているのですが、ひとつ困ったことが。 …
-
【iOS10】UNNotificationのstateと通知の削除
Sunday, June 19, 2016
iOS10の UserNotifications Framework で、UNNotificationの状態と、通知の削除についてさっとまとめてみました。 若干言い回しが曖昧かもしれませんが、ご了承ください。 …
-
【iOS10】通知に画像や動画(アタッチメント)を付与する
Sunday, June 19, 2016
そういえば1ヶ月ほどブログの更新止めちゃってました。お久しぶりです。 WWDC2016の発表を現地…ではなくweb上で色々情報をキャッチアップしてて、その中で 「UserNotifications Framework」 が気になったのでざっくり触ってみました。 今回は、通知(ローカル通知)にattachmentで任意の画像や動画を付けられるようなのでそれを試してみました。 …
-
NSLocalizedStringでkeyが見つからない時はkeyではなくて指定した文字列を出力する
Friday, April 22, 2016
NSLocalizedString を使う時に、指定したkeyが、 Localizable.strings に定義されていなかったら、指定したkeyの文字列がそのまま出力されてしまいます。 これはこれで困ったし、comment: 引数に与えた文字は単なるコメントでしかなくて、出力されません。 …
-
【書評】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.…
-
第25回 iOS馬場 に参加してきました
Saturday, February 27, 2016
実は、こういった勉強会に参加するのは初めてでした。どうもです。 初めて参加させていただきましたが、もくもく会をベースにということで、みなさん各々もくもくとやったり、 雑談があったりと、勉強会は過ごさせていただき、その後の懇親会では、情報交換をしたりと、とても有意義な時間になりました! …
-
ライブラリ「PDFGenerator」をアップデートしました
Thursday, February 11, 2016
先日ライブラリとして公開したPDFGeneratorを、1.0.0にアップデートしました。 以前のバージョンまででは、viewならviewのみ、viewならviewのみでしかPDFを生成できませんでしたが、 たとえば、 [view, image, image, view] のように、viewとimageを混ぜて生成出来るようになりました。 func generatePDF() { let v1 = UIView(frame: CGRectMake(0,0,100,100)) v1.backgroundColor = UIColor.redColor() let v2 = UIView(frame: CGRectMake(0,0,100,200)) v2.backgroundColor = UIColor.greenColor() let page1 = PDFPage.View(v1) let page2 = PDFPage.View(v2) let page3 = PDFPage.WhitePage(CGSizeMake(200, 100)) let page4 = PDFPage.Image(UIImage(contentsOfFile: "path/to/image1.png")!) let page5 = PDFPage.ImagePath("path/to/image2.png") let pages = [page1, page2, page3, page4, page5] let dst = NSHomeDirectory().stringByAppendingString("/sample1.pdf") do { try PDFGenerator.generate(pages, outputPath: dst) } catch (let e) { print(e) } } もちろん、従来通りの使い方もできます。…
-
autoreleasepoolから例外を投げられるようにする
Wednesday, February 10, 2016
最近ニッチな事しか投稿していない気がする。 何かおしゃれなUIが実現できるライブラリ!の方がウケが良いんだろうけれども..。 ライブラリの開発中に、 autoreleasepoolを使って、局所的にメモリの消費が増える部分を抑えたい しかしautoreleasepoolの内部で例外を扱う箇所がある autoreleasepool内で投げる例外を、autoreleasepoolの外に伝搬させて、外で処理をしたい という問題に直面したのですが、 do { autoreleasepool { try ~~~~~ // ★ } } catch (let e) { print(e) // ★の例外をここで処理したい } こうしたくても、autoreleasepoolに、throwsもしくはrethrowsが指定されていないので、これができません。 なので、 try autoreleasepool { try ~~~~~ // ★ } こんな感じでautoreleasepool内部の例外を伝搬させられるようにします。 public func autoreleasepool(@noescape code: () throws -> ()) rethrows { try { var error: ErrorType? autoreleasepool { do { try code() } catch (let e) { error = e } } if let error = error { throw error } }() } こんな感じで宣言してあげれば、…
-
Swiftのdo〜try〜catchとdeferの組み合わせ
Wednesday, February 10, 2016
現在PDFGeneratorの新規機能の追加だったり、より安全にPDFが出力できるように整えているのですが、 その中で、どうしても 例外 をdo〜try〜catchで処理しなくてはならなくて。 そんな時に、例えばPDFの描画を開始し、例外を返すかもしれないprocess()を実行するという流れがあった場合に、 do { UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) try process() UIGraphicsEndPDFContext() } catch (let error) { print(error) } 処理が成功する場合は、UIGraphicsEndPDFContext()が呼ばれるのですが、tryで例外がキャッチされた場合は、UIGraphicsEndPDFContext()がスキップされてしまいます。危ない… そうならないために、以下のアプローチをとります。 UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) do { try process() } catch (let error) { print(error) } UIGraphicsEndPDFContext() うーん、これでも間違ってはいないのですが、ちょっとスコープが広すぎる気がします。 そこで、deferを使って、doステートメントの中で収まるようにします。 deferは、そのスコープを抜けるときに中に書いた処理を実行してくれるものです。 今回のケースにはもってこいですね。 do { UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) defer { UIGraphicsEndPDFContext() } try process() } catch (let error) { print(error) } なんとなく、終了の処理を、process()より先に書くのは抵抗がありますが、 これで、tryで仮に例外がキャッチされて、catchステートメントに移行したとしても、UIGraphicsEndPDFContext()が呼ばれます。 流れとしては、 正常に処理される場合 UIGraphicsBeginPDFContextToFile(outputPath, CGRectZero, nil) process() UIGraphicsEndPDFContext() 例外がキャッチされる場合…
-
文字列中の数字を全角/半角変換する
Wednesday, February 10, 2016
文字列中に潜む数字だけを、他の文字に影響を与えずに変換したかったので、 調べてコードにおこして、Stringの extension として実装してみました。 記事自体はさきにQiitaに投稿したのでそちらを。 記事 コード全文は、Gistに放り投げたので、そちらを参照くださいませ。 Gist これを使えば、ユーザーがTextField等で数値を入力したときに、全角数字/半角数字を気にせず、 let input = "000" if let number = Int(input.hankaku) { print("input :", number) } として数値に変換できるので助かりますね。 もしかするとNSScannerでうまい具合にできたかもですが、とりあえずこれで良しとします。。