-
Gitで登録したエイリアスの一覧を表示するエイリアスを設定する
Tuesday, February 16, 2016
.gitconfigにあれこれaliasを貼っていくと、何があったっけってなってしまうので、 git aliasesと入力して、設定したaliasを表示する エイリアス を作ってみました。 …
-
NSLocale.preferredLanguages()を使わずに、端末の使用言語が日本語かどうかを判定する
Tuesday, February 16, 2016
寝る前に少しtry! Swift Conference Appのソースをみて寝ようと思ったら、 今までみたことがなかった判定の仕方で、使用言語が日本語かどうか判定をしていたので、なるほどな〜って思って見入ってしまいました。 …
-
SwiftでClosureを即時実行するtips
Monday, February 15, 2016
暖かかった日が過ぎてまた寒くなったせいで体がなんだかだるいですね。。 今日はよく自分が使うちょっとした小ネタを一つ。 …
-
UIBarButtonItemで隠されたボタンを使用する
Sunday, February 14, 2016
UIBarButtonItemには、typeを指定して、標準で用意されている様々なアイコンを使用できます。 (ここに一覧が掲載されています。) しかし、 < > ∧ ∨や、ゴミ箱アイコンといったものが用意されていません。 これを毎回画像で用意するのはしんどいし、"< >"と文字で生成するとなんかダサいし。。 ただ、標準アプリであるSafariとか、UINavigationBarの戻るボタン等、標準で< >を使っているのでなんとかして使えるなら使いたい。 それを解決してみます。 enum UIBarButtonHiddenItem: Int { case Previous = 101 case Next = 102 case Up = 103 case Down = 104 case Locate = 100 case Trash = 110 func convert() -> UIBarButtonSystemItem { return UIBarButtonSystemItem(rawValue: self.rawValue)! } } extension UIBarButtonItem { convenience init(barButtonHiddenItem item:UIBarButtonHiddenItem, target: AnyObject?, action: Selector) { self.init(barButtonSystemItem: item.convert(), target:target, action: action) } } このようにして、UIBarButtonHiddenItemを定義して、UIBarButtonSystemItemとのブリッジを作成します。…
-
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でうまい具合にできたかもですが、とりあえずこれで良しとします。。
-
UICollectionViewで、完全に表示されているcellのみを取得する
Sunday, February 7, 2016
UICollectionViewで取得する visibleCells のうち、“完全に"表示されているcellのみを抜き出してみます。 ここでの"完全に"は、cellが一切、スクロールの範囲外にはみ出ていないことを指します。 …
-
UICollectionViewのreloadData()直後に確実にvisibleCellsを取得したい
Sunday, February 7, 2016
UICollectionViewで、 reloadData() を呼んだ直後は、visibleCells()でCellがうまく取得できない場合があります。 …
-
Dictionaryにvalueを投げてkey(keys)を取得する
Monday, February 1, 2016
通常はDictionaryにkeyを投げて対応するvalueを取得しますが、 valueを投げて対応するkey(keys)を取得してみます。 …