サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
blog.ishkawa.org
また、元のコードのvalue, errorは両方ともOptionalなので、以下の4つの組み合わせが存在します。 None, None None, Some Some, None Some, Some 元のコードは(None, None)と(Some, Some)を考慮していません。 つまり、実行時には(None, Some)と(Some, None)の2パターンしか存在しないという約束を前提としたコードとなっています。 Resultを利用するとそのような約束を型で表すことができ、2パターンしか存在しないことがコンパイル時に保証されるようになります。 Cocoaの伝統的なメソッドに対してもResultを使用できます。
Mar 20, 2015 Objective-Cではテストケース毎にオブジェクトの一部だけ挙動を変えたい場合に、OCMockなどのライブラリを使うのが普通でした。 それらのライブラリはNSInvocationやMethod Swizzlingなどを使ったいわゆる魔術的なコードで実現されていることが多く、 “テストコードを書いているのによくわからんコードが動いてる!”ってなってモヤモヤしたりします。 一方、Swiftではmanual mockingという手法が取られたりするみたいです。 例えば、 class Object { var foo: String { return "foo" } var bar: String { return "bar" } } class ObjectTests: XCTestCase { func testFoo() { class ObjectMock:
Mar 13, 2015 資料 内容 Appleが出しているThe Swift Programming Languageに”Swift is a type safe language.”書かれているように、 SwiftをSwiftらしく書くには型を意識したコードを書くのが良いと思っています。 型を意識する前は以下のようなAPIクライアントを使ってきたのですが、 let parameters = [ "q": "APIKit", "sort": "stars", "order": "asc", ] GitHub.call(.GET, "/search/repositories", parameters) { JSON, error in if error != nil { println("error: \(error!.localizedDescription)”) } else { se
Mar 2, 2015 XCTAssertを利用しているとforced unwarpしたい場面が出てくる。例えば、
May 25, 2014 手元ではCoverStoryを使っていたのですが、なんか使いづらかったのでgcovrを使い始めました。 gcovr 3.1にはhtml出力がついていて、以下のようなコマンドでレポートを出力してくれます。 gcovr \ -r . \ --html --html-detail \ -o build/coverage.html \ -e Pods \ -e UnitTests \ -e ".*\.h"
Feb 22, 2015 堅牢で使いやすいAPIクライアントをSwiftで実装したいをライブラリにまとめてAPIKitとしてリリースしました。 なお、”Swiftらしい”というのは主観です。 https://github.com/ishkawa/APIKit 利用側のコード リクエストに渡すパラメーターは型によって明らかになっている。 レスポンスはモデルオブジェクトとして受け取れる。 成功時にレスポンスを非オプショナルな値で受け取れる。 失敗時にエラーを非オプショナルな値で受け取れる。 // リクエストに渡すパラメーターを型で制限 let request = GitHub.Endpoint.SearchRepositories(query: "APIKit", sort: .Stars) GitHub.sendRequest(request) { response in // option
Feb 18, 2015 toolという名前のコマンドラインツールをつくるとします。 Makefile ビルドターゲットのINSTALL_PATHは/usr/local/binとします。 DSTROOT=/tmp/tool.dst prefix_install: xcodebuild install -scheme tool DSTROOT=$(DSTROOT) mkdir -p $(PREFIX)/bin cp -f $(DSTROOT)/usr/local/bin/tool $(PREFIX)/bin/ class Tool < Formula homepage "https://github.com/yourname/tool" version "0.0.1" sha1 "0123456789abcdef0123456789abcdef01234567" url "https://g
Feb 17, 2015 iOS 6あたりからxib, storyboardの文字列ベースのローカライズを可能とするBase Internationalizationが導入されましたが、 xib, storyboardの.stringsのキーは”4gA-LI-pd8.title”といった謎のオブジェクトIDとなっており、メンテナンスしていくのがなかなか大変なものでした。 それに対してコード上では、NSLocalizedString("key", "comment")といった形式で予めLocalizable.stringsに自分で設定したキーを使用することができました。 xib, storyboardでもコードと同じようにLocalizable.stringsを利用できるように、ls2xsというツールをつくりました。 https://github.com/ishkawa/ls2xs インスト
Feb 17, 2015 昨年末にはてなの@cockscombさんと@yashiganiさんがつくっていたSwiftでenumとジェネリクスを活用したかっこいいAPIクライアントを書くが 面白かったので、これを参考にしつつSwiftらしい堅牢で使いやすいAPIクライアントを考えてみました。 目標としたのは以下の3つの条件を満たすことです。 レスポンスはモデルオブジェクトとして受け取る (便利) 個々のリクエスト/レスポンスの定義は1箇所で済ます (変更しやすくしたい) リクエストオブジェクトはAPIクライアントから分離させたい 例にはGitHub System Status APIを使用しています。 サンプルコードはGitHubに上がっています。 APIクライアントのインターフェース APIの呼び出し用に用意されたメソッドはcallのみで、callに渡すリクエストによってレスポンスの型が変
Jan 7, 2015 ※ 現在(2015/01/07)Circle CIのiOSビルドはベータとなっているため、利用するにはサポートへの連絡が必要です。 できること GitHubへのコミット毎に以下のタスクを実行します。 ユニットテストの実行 ipaの作成 ipaのバリデーション CrittercismにdSYMをアップロード Circle CIにテストレポートを出力 iTunes Connectにipaをアップロード これらの作業を自動化すると、masterブランチにgit pushするだけでテストが通ったアプリがiTunes Connectに登録され、 TestFlight(新)からダウンロードできるようになり、そのままApp Storeに申請することまで出来るようになります。 Circle CIのメリット 無料(1 container) 見た目がきれい private reposi
というのが出来ると思ったら、現段階ではまだできないようです。 go.tools/cmd/cover: should support -coverprofile for multiple packages *.goが含まれるディレクトリで実行して回って、出力をくっつけるスクリプトを書いて凌ぐことにしました。 profile="coverage.out" if [ -f $profile ] then rm $profile fi for dir in $(find . -type d ! -path "*/.git*" ! -path "*/_*") do if ls $dir/*.go > /dev/null 2>&1 then subprofile=$dir/coverage.tmp go test -coverprofile=$subprofile $dir if [ -f $subp
Nov 20, 2014 iOS, OSXで利用できるライブラリ管理ツールといえばCocoaPodsが有名ですが、 それとはまた違った方針のCarthageというライブラリ管理ツールがリリースされました。 GitHubのデベロッパーを中心としたチームで開発が進められているようです。 https://github.com/Carthage/Carthage インストール方法 Releasesからpkgをダウンロードして、インストーラーを実行します。 使い方 Cartfileを書く carthage updateを実行する Carthage.buildに作成された.frameworkをXcodeに追加する Cartfileではgithub, gitの2種類のキーワードが利用でき、以下のように書きます。 サポート対象 Carthageはdynamic frameworkのみをサポートするため、C
Jun 25, 2013 アプリが大きくなるとstoryboardの小回りの利かなさに泣きたくなることがあると思います。 そうした反動からすべてのUIをコードで実装しているiOS開発者も少なくないと思います。 自分は全部storyboardにして痛い目にあってから、全部コードにしてまた痛い目に遭い、 結局コードとxibとstoryboardを上手く使い分けるのが良いという結論に達しました。 最近、やり方が定まってきてストレスを感じなくなってきたので方法をまとめます。 これから書くことは個人の見解ですが、自分のやり方を決める上では無駄にならないと思います。 使い分け方と理由 基本方針: 以下に挙げる条件にマッチする場合除いて、コードで実装を行います。 xibを使う条件 viewの複雑度が高い場合(subviewが2,3個以上の場合)にはxibを使います。 xibを利用する理由は以下のような退
Oct 19, 2014 iMovie Creating App Previewsに書かれていますので、要点だけ。 QuickTime Playerを起動する New Movie Recording(command + option + N)を選択 iOS端末をMacに接続する QuickTimeのカメラを接続したiOS端末にする(画面がQuickTime Playerに表示される) 動画を撮影して保存する iMovieを起動する New App Previewを選択 Importを選択し、QuickTime Playerで撮影した動画をインポート インポートした動画をタイムライン上にドラッグして、編集する ShareからApp Previewを選択
Oct 19, 2014 iTunes Connectがアップデートされてから、1つのアプリのバージョンに対して複数のipaをアップロードできるようになりました。 しかし、ビルド番号が重複しているとエラーが発生してしまうので、ビルド番号をインクリメントしていく必要があります。 手動でビルド番号をインクリメントしてリポジトリにコミットしていくと、分散管理では矛盾が生じてしまうので、 ビルド番号にはJenkinsのビルド番号を指定し、リポジトリにはコミットしないことにしてみました。 セットアップ Jenkinsでxcodebuildを実行する前に以下のコマンドを実行するだけです。 自分はJenkinsにアドホック配布用のipaとAppStore用のipaの両方を作成させていて、 AdHoc配布用のipaをTestFlightにアップロードし、AppStore用のipaはビルド成果物として保存し
Oct 18, 2014 iOS開発のCI環境を提供するサービスには以下の2つがあります。 Travis CI Greenhouse CI また、自分でCIサーバーを立てる場合には以下の2つの選択肢があります。 Xcode Bots Jenkins 自分はお金を掛けずになんでも自動化できるJenkinsを選ぶことにしました。 Jenkinsにアクセスするために自宅のMacに繋ぎに行くのは嫌だったので、VPSでJenkinsを動かし、Macをそのスレーブにすることにしました。 Macで動くスレーブエージェントは自分からマスターに繋ぎに行ってくれるので、ユーザーとしてはVPSに繋げれば十分ということになります。 ノードの登録 “Jenkinsの管理” > “ノードの管理” > “新規ノード作成”からノードの作成を選択します。 リモートFSルートを設定し、起動方法を”JNLP経由でスレーブを起動
Oct 27, 2012 ちょっと今更な感じもありますが、iOS開発でGitを使うときのTipsを紹介します。 Gitそのものの使い方は理解している前提のもとで書きます。 バージョン管理する対象 Xcodeのプロジェクトにはバージョン管理する上で結構余計なものが入っています。 Gitで管理すべきでないもの Xcodeの作業データ Xcodeのプロジェクトは.xcodeprojですが、こいつ自身はディレクトリになっていて project.pbxproj project.xcworkspace xcuserdata というファイルが入っています。このうち、Gitで管理するべきものはproject.pbxprojです。 その他のものはXcodeの状態(グループを開いてるかなど)を管理しているものなので、 プロジェクトのバージョン管理対象としては適切ではありません。 ビルドデータ xcodebui
Aug 1, 2014 お気に入りのSwiftの略記法を紹介します。 (※ beta 4で動作確認) enumの型名の省略 enumの値をfuncの引数として渡す場合や、type annotationがついた変数/定数に代入する場合など、 あらかじめenumの型が決まっている場合には、型名を省略できます。 例えば、NSJSONReadingOptions.AllowFragmentsは以下のように.AllowFragmentsと書くことができます。 NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments, error: &error)
Jul 23, 2014 AppleのSwift Blogを読んで@auto_closureが面白そうだと思い活用方法を考えてみました。 @auto_closureはclosureを取る引数につけると、呼び出し側はclosureの{}を省略できるようになるというものです。 Swift Blogによると、AppleはSwiftでのassert()などの実装にこれを利用しているそうです。 今回はこれを利用して、条件が成立するまで待つXCTestExpectationを実装してみました。 以下のように使うことができます。 func testBlockOperation() { let queue = NSOperationQueue() let operation = NSBlockOperation(block: { NSThread.sleepForTimeInterval(1.0) })
Apr 30, 2014 iOSのアプリケーションテストを書いていると、各テストケースの前後に永続ストアやスタブサーバーなどをリセットしたくなることがあると思います。 リセットが必要なテストスイートのsetUp/tearDownに書いても良いのですが、書くのが面倒だったり書き忘れてしまうこともあるので、 すべてのテストケースについてリセットが走るようにしておいた方が心を穏やかにすることができると思います。 実現方法 すぐに思いついたのは以下のような方法です。 setUp/tearDownにリセット処理を加えたサブクラスを継承させる XCTestCaseのsetUp/tearDownをswizzleする サブクラスを継承させる方法には、KIFTestCaseなど他のライブラリのクラスには適用ができないという問題があります。 method swizzlingを利用する方法は、他のmethod
Jul 6, 2014 個人開発ではサーバーとクライアントのリポジトリを1つにまとめたいことがあると思います。
Jul 2, 2014 Travis CIはリポジトリのすべてのコミットに対してビルドを実行し、そのコミットのビルドの成否をGitHubに返してくれるようになっています。 pull requestを送った時などに見られるチェックマークがそれです。 プライベートリポジトリではJenkinsを使っているので、Jenkinsでも同様の仕組みを実現してみました。 仕組みは簡単で、すべてのコミットのビルドの前後にGitHubのCommit Status APIを叩くだけです。 自分はiOSアプリのビルドタスクをRakefileにまとめているので、スクリプトを以下のように設定しました。 curl -X POST -H "Authorization: token ACCESS_TOKEN" https://api.github.com/repos/:owner/:repo/statuses/$(git
NSRunLoop-PerformBlockをCocoapPodsに登録しろLINE株式会社— laiso(レイソー) (@laiso) 2014, 5月 27 なぜかテスト関連のツールはマジカルな実装が多いのですが、自分は愚直にテストをしたいので愚直なライブラリを書きました。 書いたのは半年前だったのですが、需要があったのでCocoaPodsに登録しました。 ざっくり説明すると、以下のようなものです。 引数に渡したblockの実行中はNSRunLoopを回してテストケースが終了しないようする *finish = YESとするとblockから抜ける タイムアウトした場合は例外を投げてテストケースを失敗させる NSRunLoop+PerformBlock 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - (void)testPerformBl
手元ではCoverStoryを使っていたのですが、なんか使いづらかったのでgcovrを使い始めました。 gcovr 3.1にはhtml出力がついていて、以下のようなコマンドでレポートを出力してくれます。 1 2 3 4 5 6 7 gcovr \ -r . \ --html --html-detail \ -o build/coverage.html \ -e Pods \ -e UnitTests \ -e ".*\.h" 出力されるHTMLは以下のようになります。 ファイルを選択すると各行の状況を確認できます。
iOSのアプリケーションテストを書いていると、各テストケースの前後に永続ストアやスタブサーバーなどをリセットしたくなることがあると思います。 リセットが必要なテストスイートのsetUp/tearDownに書いても良いのですが、書くのが面倒だったり書き忘れてしまうこともあるので、 すべてのテストケースについてリセットが走るようにしておいた方が心を穏やかにすることができると思います。 実現方法 すぐに思いついたのは以下のような方法です。 setUp/tearDownにリセット処理を加えたサブクラスを継承させる XCTestCaseのsetUp/tearDownをswizzleする サブクラスを継承させる方法には、KIFTestCaseなど他のライブラリのクラスには適用ができないという問題があります。 method swizzlingを利用する方法は、他のmethod swizzlingと衝突す
Geo IR Geo IRという名前でリリースしました。例えば、以下のような用途に利用できます。 最寄り駅についたらでエアコンをつける 自宅に近づいたら照明を点灯させる 自宅から離れたら様々な電子機器の電源を落とす 特に1つ目の用途は便利で、冬には家に着く頃には部屋が暖まった状態にすることができますし、夏には冷えた状態にすることが出来ます。 利用できる位置情報 アプリを反応させるイベントには以下の2つを指定できます。 ターゲットエリア: 指定地点から半径nメートル トリガー: ターゲットエリアへの進入時または退出時 これらの情報を組み合わせて、”最寄り駅に付いた”や”自宅から離れた”といったイベントを定義します。 利用できるリモコン信号 基本的にはどのようなリモコンも利用することができます。 その他必要なもの Geo IRの利用にはIRKitが必要です。IRKitはAmazonで購入するこ
いままでAppleにアプリを申請するタイミングでタグを打っていて、 その後にリジェクトされると以下のようなタグが残ることがありました。 非常にダサいですね。 1.0.0 1.0.0-2 1.0.0-3 最近は少し学習して、QAに入る段階でrelease/1.0.0といったブランチを切るようにしました。 審査に出した段階ではまだタグは打たず、もしもリジェクトされた場合は引き続きrelease/1.0.0を更新します。 審査を通過した場合はそこでタグを打って、release/1.0.0をmasterにマージします。 以下の図のようなイメージです。 このように運用することで、余計なタグが打たれることはありませんし、審査中のバージョンを見失うこともありません。 もしかしたら普通のiOSデベロッパーは当たり前のように実践していることなのかもしれませんが、 自分は最近までダサいタグを打ったり、タグを打
世の中にはたくさんキャッシュの実装があり、 自前の実装は捨てろなんて言われたりするのですが、 それでも自分の思い通りのキャッシュ機構を作りたくなるものだと思います。 自分はlimitに達したときにすべてのオブジェクトを削除するようなメモリキャッシュではなく、 他からの参照がないオブジェクトを選択して削除するようなメモリキャッシュが欲しかったのでISMemoryCacheを実装しました。 最近、ISMemoryCacheを更新して0.1.0を出したので、その機能を紹介します。 アプリがバックグラウンドに入ったときに他からの参照がないオブジェクトを削除 メモリ警告が出たときにすべてのオブジェクトを削除 ディスクキャッシュについてはISDiskCacheというのもあるので、そちらをどうぞ。 ISMemoryCache ISDiskCache
iOSシミュレータの日本語フォントが変になっちゃったときの対処法 – らっこのじゆうちょう こちらの記事にある通り、日本語よりも中国語が優先されていると日本語のフォントがおかしくなってしまうのですが、設定画面から日本語に設定し直すのはちょっとだけ面倒です。 Arguments Passes On Launchに以下の値を設定しておくと、必ず日本語に設定された状態でアプリが立ち上がるので、付き合いが長いプロジェクトでは設定しておくと楽かもしれません。 1 -AppleLanguages (ja) 参考: iOS – Launch Arguments を使った一つ上の NSLocalizedString – Qiita
次のページ
このページを最初にブックマークしてみませんか?
『https://blog.ishkawa.org/』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く