ブックマーク / blog.ishkawa.org (20)

  • iOSDCで「コード生成による静的なDependency Injection」について話した & 口頭原稿を公開

    Sep 18, 2017 このところかなり忙しく、iOSDCでちゃんとしたことを話せるのか不安でしたが、なんとか無事に終わりました。あまり会場を盛り上げることができず、後半はしどろもどろで死にたくなりましたが、面白かったと言ってくれた方もそれなりにいたので少し安心しました。 DIは今回の話以外にも色々なことに挑戦していて、最初はデフォルト引数を使った手動のinitializer injectionから始めて、SwinjectやCleanseなどのライブラリを試してみたり、Cake Patternを模倣してみたりしていました。それらを通じて、自分が求めるDIのプラクティスは 依存の宣言とインスタンスの取得のためのコードが単純かつ十分に少ない コンパイル時に依存関係の解決が検証される というものだとわかりました。もしも「dependencyの宣言さえしておけば、あとはコンパイルエラーを直してい

    iOSDCで「コード生成による静的なDependency Injection」について話した & 口頭原稿を公開
    yfnt
    yfnt 2017/10/20
  • #swift2symposium でSwiftのパターンを紹介してきた

    Aug 31, 2015 The Swift Programming Language: Patterns Swiftのパターンは値の性質を表してマッチングを行うもので、switch文などに使われているものです。これまでは、switch文の柔軟さを知っていても背景にあるパターンという存在を知らなかったため、強力だけど気味が悪いなあと思っていました。パターンの文法がわかると気味の悪さがいくらか解消されて、気持よくパターンマッチングができるようになると思います。あとでハッシュタグを振り返ってみると同様に思っていた人が数人いたようで、発表して良かったなあと思いました。 スライドの最後の方に紹介されているUITableViewControllerの実例のような、実際にアプリ開発で使えるテクニックをもっと見つけていきたい。

    #swift2symposium でSwiftのパターンを紹介してきた
    yfnt
    yfnt 2015/08/31
  • Swift 2でのAPIKit + Himotoki

    Jul 29, 2015 Swift 2の利点を最大限に活かすため、APIKitのデザインは大幅に刷新されました。型制約つきprotocol extensionsとHimotokiと組み合わせるとresponseFromObject(_:URLResponse:)にデフォルト実装を与えられるので、個々のリクエストの定義を楽にできます。以下はその例です。 // https://developer.github.com/v3/search/#search-repositories struct SearchRepositoriesRequest: GitHubRequestType { enum Sort: String { case Stars = "stars" case Forks = "forks" case Updated = "updated" } let query: Strin

    Swift 2でのAPIKit + Himotoki
    yfnt
    yfnt 2015/07/30
  • Swiftのmanual mocking

    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:

    Swiftのmanual mocking
    yfnt
    yfnt 2015/03/20
  • APIKitでSwiftらしいAPIクライアントを実装する

    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

    APIKitでSwiftらしいAPIクライアントを実装する
    yfnt
    yfnt 2015/02/23
  • ls2xsでLocalizable.stringsからStoryboardの.stringsを自動生成する

    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 インスト

    ls2xsでLocalizable.stringsからStoryboardの.stringsを自動生成する
    yfnt
    yfnt 2015/02/18
  • Swiftで書いたコマンドラインツールをHomebrewでインストールできるようにする

    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

    Swiftで書いたコマンドラインツールをHomebrewでインストールできるようにする
    yfnt
    yfnt 2015/02/18
  • 堅牢で使いやすいAPIクライアントをSwiftで実装したい

    Feb 17, 2015 昨年末にはてなの@cockscombさんと@yashiganiさんがつくっていたSwiftでenumとジェネリクスを活用したかっこいいAPIクライアントを書くが 面白かったので、これを参考にしつつSwiftらしい堅牢で使いやすいAPIクライアントを考えてみました。 目標としたのは以下の3つの条件を満たすことです。 レスポンスはモデルオブジェクトとして受け取る (便利) 個々のリクエスト/レスポンスの定義は1箇所で済ます (変更しやすくしたい) リクエストオブジェクトはAPIクライアントから分離させたい 例にはGitHub System Status APIを使用しています。 サンプルコードはGitHubに上がっています。 APIクライアントのインターフェース APIの呼び出し用に用意されたメソッドはcallのみで、callに渡すリクエストによってレスポンスの型が変

    堅牢で使いやすいAPIクライアントをSwiftで実装したい
    yfnt
    yfnt 2015/02/17
  • Carthage: Swift対応の新しいライブラリ管理

    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

    Carthage: Swift対応の新しいライブラリ管理
    yfnt
    yfnt 2014/11/21
  • Swiftの略記法

    Aug 1, 2014 お気に入りのSwiftの略記法を紹介します。 (※ beta 4で動作確認) enumの型名の省略 enumの値をfuncの引数として渡す場合や、type annotationがついた変数/定数に代入する場合など、 あらかじめenumの型が決まっている場合には、型名を省略できます。 例えば、NSJSONReadingOptions.AllowFragmentsは以下のように.AllowFragmentsと書くことができます。 NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments, error: &error)

    Swiftの略記法
    yfnt
    yfnt 2014/08/01
  • auto_closureを利用して条件成立を待つXCTestExpectationをつくる

    Jul 23, 2014 AppleSwift Blogを読んで@auto_closureが面白そうだと思い活用方法を考えてみました。 @auto_closureはclosureを取る引数につけると、呼び出し側はclosureの{}を省略できるようになるというものです。 Swift Blogによると、AppleSwiftでのassert()などの実装にこれを利用しているそうです。 今回はこれを利用して、条件が成立するまで待つXCTestExpectationを実装してみました。 以下のように使うことができます。 func testBlockOperation() { let queue = NSOperationQueue() let operation = NSBlockOperation(block: { NSThread.sleepForTimeInterval(1.0) })

    auto_closureを利用して条件成立を待つXCTestExpectationをつくる
    yfnt
    yfnt 2014/07/23
  • iOS開発とGitタグ

    いままで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デベロッパーは当たり前のように実践していることなのかもしれませんが、 自分は最近までダサいタグを打ったり、タグを打

    iOS開発とGitタグ
    yfnt
    yfnt 2014/04/21
  • XCTest + iOS 7でCoverallsを利用する

    XCTest + iOS7でテストを実行しても上手くコードカバレッジが取得できずに困っていたのですが、 最近@tokoromさんが取得できる方法を紹介していたので、 そちらを参考にして対応してみました。資料は以下のものです。 My unit test environment for Objective-C Coverallsに対応したライブラリは以下のものです。 ISHTTPOperation ISDiskCache ISMemoryCache NSRunLoop+PerformBlock 対応の肝となるのはISGcovFlusherをテストターゲットに追加しておくことです。 これを追加することでテスト終了時に__gcov_flush()を自動的に呼んでくれて*.gcdaが出力されるようになります。 なお、__gcov_flush()を呼び出すにはBuild Settingsの”Instr

    yfnt
    yfnt 2014/01/16
  • デバッグ中にJSONをサッと出力する

    NSDictionaryやNSArrayのdescriptionはそれとなく見やすいフォーマットで出力されますが、JSONで欲しくなる場合があります。 しかも、デバッグ中に欲しくなったりします。 XcodeのLLDBは~/.lldbinit-Xcodeに独自のコマンドを定義することができるので、 pretty printedなJSONを吐くコマンドを定義してカジュアルにJSONを得られるようにしてみました。 1 command regex pj 's/^(.+)$/po [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:%1 options:1 error:nil] encoding:4]/' ここで定義したpjコマンドを使うと以下のようなNSDictionaryから 1 2 3 NSDiction

    yfnt
    yfnt 2014/01/09
  • 単体テストの実行時に非同期処理を待つ

    SenTestingKit/XCTestは非同期処理を待たずにテストケースを終了してしまうので、 直接SenTestingKit/XCTestを利用する場合には自分でNSRunLoopを回して処理の完了を待つ必要があります。 これまでSenTestCaseにfinishedフラグが追加されたサブクラスを使ったりしていたのですが、 どうしてもテストコードが明示的にならなくて悩んでいました。 いままで書いていたテストコードは以下のような感じです。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - (void)testExample { // step 1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^

    yfnt
    yfnt 2013/11/24
  • JSONにNSNullが入ってきたとき

    多くのiOSアプリはサーバーとの通信が必要で、やりとりされるデータのフォーマットにはJSONが採用されることが多いと思います。 iOS 5からは標準ライブラリにNSJSONSerializationが導入され、特に理由がなければJSONのエンコード/デコードにはこれを利用します。 NSJSONSerializationが扱うオブジェクトは以下の5種類のオブジェクトです。 NSString NSNumber NSArray NSDictionary NSNull そこで心配になるのが、予期しないところにNSNullが入ってきて”unrecognized selector sent to instance.“となってしまうことです。 NSNullではなくてnilが入っていてほしいと考える人は多いようですが、そもそもNSArrayやNSDictonaryはnilを含むことはできず、 そのような状

    yfnt
    yfnt 2013/11/17
    なるほー
  • 複数のiOSバージョンでのテストを自動的に実行する

    Xcode 5になってxcodebuildコマンドも進化したらしいのですが、あまり変更を追えていませんでした。 今日、ぼんやりとman xcodebuildを眺めていたら-destinationというオプションをみつけました。 これを使えば任意のiOSバージョンでテストを走らせられるなと思ってやってみました。 はじめはXCTestで実行したかったのですが、iPhoneSimulator6.0.sdkやiPhoneSimulator5.0.sdkには xctestという実行ファイルが含まれていないため、以下のようなコマンドでテストを実行することができませんでした。 (OS=7.0だと実行できます。) 1 xcodebuild test -scheme Example -destination "name=iPhone,OS=6.0" OCUnitを実行するounitという実行ファイルはiPh

    yfnt
    yfnt 2013/10/07
  • iOS開発でのユニットテストを身につけるには

    テストがないコードはクソとか、このテストツールこそ至高みたいな話が世に溢れているわけですが、 そういう状況になってくると、どうやって始めたらいいのかわからなかったりすると思います。 そういう人のために、何を読んで勉強し、何を使って何を書くと始めやすいかという抽象的な解説をしようと思います。 テストフレームワークの選択 テスト初心者の最初の壁はフレームワークの選択です。 iOSのテストについて調べると、SenTestingKitはクソとかGHUnit最高とかKiwiこそ至高とか言っている人がいると思います。 ですが、入門に最も適しているのはSenTestingKitです。 セットアップが他と比べて簡単だということと、機能が十分に小さくて機能に溺れることがないということが理由です。 SenTestingKitの使い方を学ぶ いきなり突き放すようなんですが、Appleの公式のドキュメントを読むの

    yfnt
    yfnt 2013/09/01
  • GHFeedで利用しているライブラリ一覧

    先日GHFeedというGitHubのフィードを読めるiOSアプリをリリースしました。 今日はGHFeedの開発に利用したライブラリを紹介しようと思います。 NJKWebViewProgress UIWebViewの読み込み状況を取得してくれるライブラリです。 作者は@ninjinkunさんです。 このライブラリが出してくれる値は大体0.0, 0.1, 1.0なので、 GHFeedではこれらの値を補間するようなアニメーションを追加で実装しています。 KLSwitch フラットデザインなUIButtonのライブラリです。 UIAppearanceにも対応するなど、結構細かいところまで実装が行き届いていました。 TUSafariActivity UIActivityViewControllerにOpen in Safariを追加するライブラリです。 SSKeychain キーチェーンのwra

    yfnt
    yfnt 2013/08/28
  • モバイル版のGitHubにフィードがなかったので、補うiOSアプリをつくってリリースした

    プッシュ通知などもついていて、なかなか便利なものになりました。 アプリをダウンロード GitHubのモバイル版(Web)はかなり良くできていて流石だなあと思っていたのですが、 肝心のフィードがなかったりして、モバイル版の役割を十分にカバーできていないと思いました。 それを補うのがGHFeedです。具体的には以下の2つの機能を提供しています。 フィードの表示 ハイライトされるイベントをプッシュ通知 前者はpull型の利用で、時間があるときにフィードを見て面白そうなリポジトリがあればスターをつけたりしておく、というような利用を想定しています。 後者はpush型で、自分が関わるリポジトリにイベントがあった時に早く気づけるようにするという利用を想定しています。 自分はこの2つの利用パターンが可能になって、はじめてモバイル版のGitHubが成り立つんじゃないかなあと思い、開発にいたりました。 振り返

    yfnt
    yfnt 2013/08/27
  • 1