タグ

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

  • Storyboardとの付き合い方 2018

    Aug 12, 2018 少し前に、自分のStoryboardの使い方をツイートしたら割と反応があったので、改めてまとめてみようと思います。これまで何年かiOSアプリの開発をしてきて、Storyboardとの付き合い方は何度も変わりました。なので、今回紹介するものはあくまで2018年現在のもので、来年には変わっているかもしれません。 説明のイメージを掴みやすくするため、画面の例を用意しました。左が編集時のStoryboardで、右が実行時のiOSシミュレーターです。具体的なトピックが出た時に、この例を説明に使うことがあります。 記事の最後にこれが動作するサンプルコードも用意しましたので、興味があればどうぞ。 Storyboardを使う目的 以下の2つを重視して、Storyboardを選択しています。 動作確認に掛かる時間を短縮する 成果物の構造を把握しやすくする ただし、Storyboar

    Storyboardとの付き合い方 2018
    Nyoho
    Nyoho 2018/08/13
  • モバイルアプリでgRPCを使う

    Feb 7, 2018 最近は、モバイルアプリとサーバーの通信にgRPCを使っています。gRPCは、サーバー同士の通信では徐々に使われ始めている印象がありますが、モバイルアプリでの使用例はまだ少ないと思うので、動機とか、感想とか、ウチはこうしてるというものを共有します。 リクエストとレスポンスの定義を1箇所にまとめる 今のプロジェクトでは、同じデータをサーバー, iOS, Android, Webで扱う予定がありました。普通のREST APIでは同じデータを4つの言語に翻訳する必要がありましたが、これをprotoへの翻訳の1回だけで済ませたいというのが、gRPCを使う最初の動機でした。 gRPCでは、リクエストとレスポンスの全ての情報をprotoファイル上で表現し、それを元に各言語のコードを自動生成します。APIドキュメントを人間が各言語に翻訳する場合と比べると、コードを書く手間が省けます

    モバイルアプリでgRPCを使う
    Nyoho
    Nyoho 2018/03/25
  • モバイルアプリでgRPCを使う

    Feb 7, 2018 最近は、モバイルアプリとサーバーの通信にgRPCを使っています。gRPCは、サーバー同士の通信では徐々に使われ始めている印象がありますが、モバイルアプリでの使用例はまだ少ないと思うので、動機とか、感想とか、ウチはこうしてるというものを共有します。 リクエストとレスポンスの定義を1箇所にまとめる 今のプロジェクトでは、同じデータをサーバー, iOS, Android, Webで扱う予定がありました。普通のREST APIでは同じデータを4つの言語に翻訳する必要がありましたが、これをprotoへの翻訳の1回だけで済ませたいというのが、gRPCを使う最初の動機でした。 gRPCでは、リクエストとレスポンスの全ての情報をprotoファイル上で表現し、それを元に各言語のコードを自動生成します。APIドキュメントを人間が各言語に翻訳する場合と比べると、コードを書く手間が省けます

    モバイルアプリでgRPCを使う
    Nyoho
    Nyoho 2018/02/10
  • iOSDCでRxSwiftを紹介してきた + ReactiveCocoaの補足

    Aug 23, 2016 オタクなのでRxSwiftの話になるとつい早口にアレコレ喋りまくってしまうのですが、今回はそういった気持ちをそっと胸にしまって、RxSwiftを導入するとアプリ開発にどういう変化が起こるのか、なるべく多くの方に伝わるように心がけて話しました。 スライド: http://blog.ishkawa.org/talks/2016-08-20-iosdc/ ビデオ: https://abemafresh.tv/tech-conference/32381 (1:00:00~) 3行で書くと以下の通りです。 RxSwiftはイベントストリームをObservableで抽象化するライブラリ 大抵のイベント処理はObservableからObserverへの接続で実装できる イベントストリームの依存関係はオペレーターから読み取れる その他、以下の3つについても話そうと思っていましたが

    iOSDCでRxSwiftを紹介してきた + ReactiveCocoaの補足
  • APIKit: レスポンスに応じた独自のエラーを投げる

    { "message": "Validation Failed", "errors": [ { "resource": "Issue", "field": "title", "code": "missing_field" } ] } 今回は、このようなエラーをリクエストの呼び出し側に伝える方法を説明します。なお、この説明はDefining Request Protocol for Web Serviceのエラーの扱いをもう少し詳しく説明したものとなります。 サービス用のリクエストプロトコル APIKitでは、特定のサービス(Web API)向けのリクエストの特徴をまとめるために、サービス用のリクエストプロトコルを定義します。今回はGitHub APIを例としているので、baseURLのデフォルト値がhttps://api.github.comとなっているGitHubRequestを定義しま

    APIKit: レスポンスに応じた独自のエラーを投げる
    Nyoho
    Nyoho 2016/05/25
  • try! Swiftにスピーカーとして参加しました

    Mar 12, 2016 良いセッションはたくさんあったのですが、書き切れませんね。 平常心で型を消し去る (Gwendolyn Weston) Associated Typeを持つプロトコルは型制約でしか使えないため、型パラメーターが利用側に波及しがちになるという問題があります。セッションでは型パラメーター地獄について話していなかったと思いますが、紹介されていたAnyPokemonのようなパターンは(表面上の)型を消すことでこの問題を解決できそうだなあと思いました。また、このパターンはRxSwiftでもAnyObserverで使われています。 完全に余談ですが、Gwendolyn Westonさんはスピーカーディナー後のカラオケパーティでモーニング娘のLOVEマシーンを歌っていて、めっちゃ上手かったです。 Swiftのエラー処理についての三つの話 (Yuta Koshizawa) Swi

    try! Swiftにスピーカーとして参加しました
    Nyoho
    Nyoho 2016/04/19
  • #potatotips でAPIKitを紹介してきた

    Mar 13, 2015 資料 内容 Appleが出しているThe Swift Programming Languageに”Swift is a type safe language.”書かれているように、 SwiftSwiftらしく書くには型を意識したコードを書くのが良いと思っています。 型を意識する前は以下のような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

    #potatotips でAPIKitを紹介してきた
    Nyoho
    Nyoho 2016/02/12
  • パターンマッチングでprepareForSegue(_:)のネストを浅くする

    Nov 14, 2015 1年前に書いたprepareForSegue(_:)がoptional bindingとtype castingの地獄になっていたので、パターンマッチングで描き直してみました。確かにネストは浅くなりましたが、これはこれで地獄なのかもしれません。 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { switch (segue.identifier, segue.destinationViewController, sender) { case ("Web"?, let viewController as WebViewController, let cell as UITableViewCell) where cell == feedbackCell: viewC

    パターンマッチングでprepareForSegue(_:)のネストを浅くする
    Nyoho
    Nyoho 2016/02/07
    あっこれいいですね〜 < パターンマッチングでprepareForSegue(_:)のネストを浅くする
  • 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
    Nyoho
    Nyoho 2016/02/04
    APIKitとHimotoki便利だな / 更新感謝
  • #swift2symposium でSwiftのパターンを紹介してきた

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

    #swift2symposium でSwiftのパターンを紹介してきた
    Nyoho
    Nyoho 2015/09/01
  • 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
  • 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対応の新しいライブラリ管理
  • 位置情報でリモコンを操作するiOSアプリをリリースしました

    Geo IR Geo IRという名前でリリースしました。例えば、以下のような用途に利用できます。 最寄り駅についたらでエアコンをつける 自宅に近づいたら照明を点灯させる 自宅から離れたら様々な電子機器の電源を落とす 特に1つ目の用途は便利で、冬には家に着く頃には部屋が暖まった状態にすることができますし、夏には冷えた状態にすることが出来ます。 利用できる位置情報 アプリを反応させるイベントには以下の2つを指定できます。 ターゲットエリア: 指定地点から半径nメートル トリガー: ターゲットエリアへの進入時または退出時 これらの情報を組み合わせて、”最寄り駅に付いた”や”自宅から離れた”といったイベントを定義します。 利用できるリモコン信号 基的にはどのようなリモコンも利用することができます。 その他必要なもの Geo IRの利用にはIRKitが必要です。IRKitAmazonで購入するこ

    位置情報でリモコンを操作するiOSアプリをリリースしました
  • iOS開発でのユニットテストを身につけるには

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

  • 次世代のKIF(2.0.0)が良さそう

    KIFはSquare製のIntegration Testsのためのフレームワークです。 この半年くらいでKIFは大幅なアップデートに取り組んでいるらしく、現在はプレリリース版の2.0.0pre5が公開されています。 まだ正式版はリリースされていないのですが、ひとまずプレリリース版を動かしてみました。 KIF(kif-next) KIFは元々GHUnitのようにアプリのビルドターゲットを複製し、エントリーポイントを少し変更することで複製したアプリ上でテストを走らせるというものでした。 新しいバージョンではSenTestingKitを利用することでXcodeに統合されたテストとして実行できるようになりました。 具体的には以下のようなメリットがあります。 command+Uで実行できる エラーが出た箇所を追跡しやすい 部分実行ができる xUnit/xSpec形式でテストを書ける SenTesti

    Nyoho
    Nyoho 2013/09/01
    楽しそうなのでメモ “KIFはSquare製のIntegration Testsのためのフレームワークです”
  • 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

    Nyoho
    Nyoho 2013/09/01
    ブラボー
  • 1