hachinoBlog

hachinobuのエンジニアライフ

【備忘録】Swift Concurrencyを色々いじってみた

最近SwiftConcurrencyに既存プロジェクトを置き換えたりする中で色々と調べたので備忘録として書き残します。 主にasync/await, Async(Throwing)Stream, Taskについての記事になります。 async/awaitの基本的な使い方 asyncとawaitについて asyncはメソッド…

Swift Embedded Framework内でCやObjective-Cのライブラリを使う方法

背景 運用しているSwiftアプリでObjective-C製のCocoaPodsライブラリをSwift Embedded Frameworkに閉じて使いたかった。 アプリケーション側で使うならお決まりのBridging Headerファイルを追加して、そこに適宜書いていけば良いのだけれど、Swift Embedded …

遷移中にNavigationBarの設定をアニメーションさせて綺麗に見せる

背景 PushやModal遷移の時に呼び出し元ViewControllerと呼び出し先ViewControllerでNavigationBarやボタンの色が違う時に、その遷移の進捗に応じて設定の色などをアニメーションで変えて綺麗に見せたいかった 方法 UIViewControllerTransitionCoordinatorの…

そのサイトがATS対応しているのかを調べる方法

背景 あれ? WebViewで外部サイトが開かないんですけど・・もしかしてみたいな状況 やり方 nscurlコマンドというものを知った これを使うとそのドメインのサイトがATSに対応しているか、iOS側でどういった設定をすれば通るようになるのかを教えてくれる。 ns…

管理者権限ないのでHomebrewでrbenvを入れたけどrbenv execを省略できなくてハマったメモ

背景 管理者権限ない状態でgem install bundler叩いてもPermissionErrorになるのは周知の通り なのでrbenv経由でruby入れるとユーザー領域にgemをインストールできるよってことで下記をやってみたが、コンソール再起動すると、bundleコマンドを叩いてもコマ…

WKWebViewのscrollの高さを動的に読み込む方法

背景 セルにWKWebView引いてコンテンツを読み込ませて、読み込み後のスクロールの高さを取得して、セルの高さにしたかったけど色々つまったので備忘録 解決方法 StackOverFlowに載ってる方法でほぼ問題なし How to determine the content size of a WKWebVie…

RuntimeError - [Xcodeproj] Unknown object version. を解消する

背景 Xcode 9.3 betaを使ってPodfile作って、いつものように pod install を叩くと RuntimeError - [Xcodeproj] Unknown object version. とエラーが出た。 色々調べてみるとCocoaPodsのリポジトリにissue立ってて解決されていた (#7458)https://github.com/…

今更だけどSwiftの型消去の使い所が少し分かったので備忘録

背景 2016年のtry!Swiftで話題になった型消去 なかなか使い所が分かってなかったんだけど、利用したいシーンに出会ったので備忘録を記す 説明 前提 私は、開発する上で、よくHTTPクライアントのライブラリであるAPIKitを使っています。 APIKitの使い方を簡単…

iOS CleanArchitectureを使ってみた感想

CleanArchitectureを使ったサンプルアプリを作成したので、説明していきたいと思います サンプルアプリ まず、作成したアプリについてです Qiitaのクライアントです 認証 投稿一覧 詳細 ユーザー投稿一覧 詳細 ソースコード https://github.com/hachinobu/Cl…

UITableViewCellが無い領域のUITableViewのSeparatorを消す方法

背景 TableViewCellが表示されている領域にはSeparatorあって良いんだけど、Cellが1個しかなくて後はUITableViewの領域で、その領域ではSeparatorを表示したくなかった 解決 TableViewのTableFooterViewに何か突っ込めばUITableView領域にSeparatorは出ない …

SwiftTaskであるAPI処理の結果をもとにSuccessでTask.allを使う方法

背景 ある通信処理の成功結果をもとに複数通信をネストせずに書きたかった SwiftTaskを使うと簡単にできる コード private func generateTaskA() -> Task<Float, [String], NSError?> { return Task { (fulfill, reject) in //通信処理 成功時にはStringの配列が得られる fulfill(result</float,>…

Swiftのインスタンスから型メソッド(クラスメソッド)を呼び出す方法

背景 あるクラスのインスタンスから、そのクラスの型メソッド(クラスメソッド)を呼び出したいときにObjective-Cでは下記のようにやっていたけれどSwiftだとどう書くのか知りたかった [[instance class] classMethod]; 結論 dynamicTypeを使うことでインスタ…

tableViewCell上にUISliderを載せてアニメーションしたらおかしくなる件

事象 カスタムのUITableViewCell上にUISliderをaddしてcellforRowで読み込まれると同時にSliderをアニメーションしてみたのだけれど、minimumTrackTintColorとmaximumTrackTintColor割合がおかしく、明らかに変なアニメーションをしだした。 解決方法 Slider…

Android Studio0.8.14にしたらエラーしまくった

背景 Android Studioのverを0.8.14にしたらエラーになったので解決方法をメモ 解決方法 まず、アップデートしているとAndroid Studio配下にsdkフォルダを配置するなと怒られるので、sdkの場所をmvコマンドで適当な場所に移す。 sdkを移した後にリトライすれ…

NSLayoutConstraintを使ってAutoLayoutをコードで書く

背景 AutoLayoutをxib上で使っているのだけれどxibでは表現できるAutoLayoutに限界があると思いコードで書く方法を調べたのでメモ。 サンプル 1.self.viewから左20,上20のマージンをとった位置にwidth100,height100の赤いViewを配置 UIView *redView = [[UIV…

iOS7とiOS8でUIScreenのboundsのサイズが違うので対応する

背景 iOS8からUIScreenのboundsを取得すると端末の向きに応じてwidthとheightの値が変更されるようになりLandscape対応でちょっと困ったのでメモ iOS7とiOS8で差分を埋める + (CGSize)mainScreenSize { CGSize screenSize = [UIScreen mainScreen].bounds.si…

重複件数まで取得できるNSCountedSet

背景 例えばこんな問題があったとする。 インプットした文字列の単語の重複件数を求めなさい。 例) banana 答) b: 1 a: 3 n: 2 この問題を何か効率的に処理できる方法はないかと考えたときにNSCountedSetを見つけたので使い方をメモ。 使い方 NSCountedSetは…

git clone --recursive をするとサブモジュールも一緒に持ってきてくれる

git

背景 SDWebImageのDemoを動かしたくてgit cloneして動かしたらfile not foundでエラーになった。 解決方法 SDWebImageはサブモジュールを使用しているので、それも一緒に入れてやる必要がある。 なのでgit clone する際に --recursive オプションをつけてや…

SwiftのArrayとDictionaryの使い方

背景 基本的な言語仕様はふんわりと学んだので、今後多用するであろうArrayとDictionaryの使い方を調べたのでメモ。 Array サンプルコード // immutableなString型の配列 let names: String[] = ["name5", "name2", "name1", "name3"] //各データを取得 let …

addSubviewやremoveFromSuperviewをトリガーにする方法

背景 addSubviewやremoveFromSuperviewしたタイミングでViewの処理をしたかったので色々調べてたら出てきたのでメモ。 方法 willMoveToSuperview:、didMoveToSuperviewメソッドを使用すれば良い。 willMoveToSuperview: 自身(UIView)が親Viewに追加される直…

CoreDataで集計関数を使う

背景 前回のNSExpressionを使って今度はCoreDataで集計関数を使用する方法を調べたのでメモ。 サンプル 下記のデータ構造とデータを格納しているSeminarsテーブルがあると仮定する。 Seminars date seminar charge 2014/05/01 SeminarA 1,000 2014/05/02 Sem…

配列内で集計関数(最大値、最小値、平均値、合計値など)を使用する方法

背景 配列内の値の合計や最大値などを取得したい場合に何か良い方法はないかと調べた。 方法 NSExpression を使用することで集計関数の式を定義できる。 //最大値 NSArray *numArray = @[@3, @6, @12, @8]; NSExpression *maxExpression = [NSExpression exp…

NSURLConnectionでオレオレ証明書(自己署名証明書)を許可する方法

背景 オレオレ証明書を使用している開発機にNSURLConnectionでhttps接続しようとしたら下記エラーが出力された。 NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) 解決方法 NSURLConnectionのデリゲートの - (void)conn…

CocoaPodsで[overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Pods.xcconfig'.]の対処方法

背景 CocoaPodsでライブラリをインストールしようとしてpod installコマンドを叩いた際に下記が出力されたので調べた。 [!] The target `MyProject [Debug]` overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Pods.xcconfig'. - Use the…

iOS7でステータスバーの領域が黒く塗りつぶされてしまう場合の対処方法

背景 iOS7でNavigationControllerのNavigationBarを使用しているにも関わらず下記のようにステータスバーが黒く塗りつぶされてしまい対応するのに時間を要してしまったのでメモ。 原因 この現象になる原因としてはiOS6以前でUINavigaitonBarに画像を下記のよ…

NSDateで取得したGMT時間のままNSStringに変換する方法

背景 NSDateのdateメソッドで時刻を取得すると日本時間とは9時間差のGMT時間が返されることは知っていたのだがNSDateFormatterで取得した時間をNSString型に変換したらGMT時間でなく現地時間に変換されてしまっていたので調べた。 現象 NSDate *now = [NSDat…

NSDictionaryの配列からNSPredicateを使って該当のNSDictionaryを抜き出す方法

背景 NSDictionaryの配列から該当のNSDictionaryを取得する際に今まではforループで1つ1つ判定して取得していたのだが速度が遅いのでNSPredicateを使って該当のNSDictionaryを取得する方法を調べた。 やり方 NSArrayのfilteredArrayUsingPredicateで取得し…

16進数のカラーコードをもとにUIColorを作成する

背景 カラーコードは大体16進数表記なのでiOSのUIcolorを作る際に16進数表記のカラーコードを10進数に変換してUIColorを作成したかったので調べた。 やり方 下記メソッドをUIColorのカテゴリに追加した。 + (UIColor *)colorWithHexString:(NSString *)hex {…

WebViewで表示しているHTMLのソースを表示する方法

背景 プログラム内で動的に生成したHTMLをWebViewで表示した際にデバッグ目的としてHTMLのソースを表示したくて調べた。 やり方 表示終わりのwebViewDidFinishLoad:メソッドあたりに下記コードを追加。 - (void)webViewDidFinishLoad:(UIWebView *)webView {…

WebViewでHTMLを読み込んだ際に画像が表示されない現象

背景 久しぶりにHTMLつくってWebViewで表示させたらHTML内で表示するはずの画像が表示されなかった。 問題のコード NSString* htmlFileName = @"sample.html"; NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:nil]; NSString…