Swift - Dictionaryを保存する

サーバーからのレスポンスをキャッシュしたい時なんぞに、
こういったことが必要になることがあります。

NSDictionaryをNSDataに変換

NSDictionaryをplistに変換しても良かったのだけれど、
何故か私が渡すDictionaryでは、writeToFileがfalseを返すばかりで失敗するため、
いろんなところを参考にして、NSDataに変換して保存する方法をとった。
まあplistだと中身を見ることができてしまうので、バイナリに変換するのがいいんでないかなと思います。

NSKeyedArchiverをつかってアーカイブ・アンアーカイブ

NSKeyedArchiverをつかってNSDictionaryをバイナリに変換します。

// アーカイブ
let data = NSKeyedArchiver.archivedDataWithRootObject(dictionary)

// アンアーカイブ
let dictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data)

NSFileManagerで任意のディレクトリに保存

あとは仕様にそった場所にNSFileManagerクラスで保存してあげればよい。

iOS - シュミレーター内のアプリディレクトリを確認する方法

NSFileManagerなんかでアプリ内ディレクトリに保存したものを確認したい時は、
以下のディレクトリを確認すれば良い。

/Users/(ユーザー名)/Library/Developer/CoreSimulator/Devices/(シュミレーターID)/data/Containers/Data/Application/(udid)

Developerフォルダ

Developerフォルダは不可視になっているので、
ターミナルで行きたい場所までcdして、$open . でファインダーを開いてやるとよいです。

その他

シュミレーターIDが分からなければWindow > Devicesを確認すれば問題なし。 udidはどこをみたらいいのかイマイチわからないため、 フォルダ内Snapshotsの中身をみて判断するしかなさそうです。

UIKit - tintColorについて調べた

本を読んでいたら、tintColorについて発見があったのでメモ。
単にUIの色を変えるという認識でした。

親のビューのtintColorを変更すると、子のビューのtintColorが変更される

let parentView = UIView()
let stepper = UIStepper()
stepper.tintColor = UIColor.yellowColor() // 黄色を設定
parentView.addSubview(stepper)

parentView.tintColor = UIColor.blueColor() // 子供すべてのtintColorが青色に変更される

さらに、tintColorにnilを代入すると、親のtintColorがあてがわれる。

let parentView = UIView()
parentView.tintColor = UIColor.redColor()

let stepper = UIStepper()
stepper.tintColor = UIColor.greenColor()

stepper.tintColor = nil //親の赤色がtintColorに設定される

tintColorを変更すると、変更したビューではtintColorDidChangeがコールされる

さらにtintColorを変更するとコールされるメソッドもあった。

let parentView = MyView()
parentView.tintColor = UIColor.redColor()

class MyView: UIView {
    override func tintColorDidChange() {
        print(tintColorを赤色に変更した)
    }
}

まだまだ知らないことがたくさんありますね〜。

絶賛ブランクを埋めるために、以下の本を読んでUIKitについて学び直してます。
小手先のテクニックではなくて、UIKitについてしっかり書かれているので学びがとても多いです。

CoreGraphics - CGRect, CGPointが短形内にあるかどうかを調べる

短形A、ポイントAが短形Bの範囲内にあるかどうか、
調べるには以下のメソッドを使うようだ。

// 短形を調べる場合
CGRectContainsRect(rect1: CGRect, _ rect2: CGRect) -> Bool

// ポイントを調べる場合
CGRectContainsPoint(rect: CGRect, _ point: CGPoint) -> Bool

知らなんだ。

Swift - 文字列の計算式を計算する

"3+5/2"のような文字列の計算式の答えを求めるには、以下のように書きます。

let expression = NSExpression(format: $計算式文字列$)
let result = expression.expressionValueWithObject(nil, context: nil) as? NSNumber

resultには、正確な計算式であれば答えとなるNSNumberが、計算式でなければnilが返ってきます。
Javascriptのevalのようなものですね。

"5/3"が計算式だとすると数字は全てIntなので、小数点の答えは出ません。
小数点まで求めるのであれば、計算式内の数字を正規表現かなにかで、
”X.0”としてやればDouble型になるので、小数点の答えも出るのではないかと思います。

参考:

spin.atomicobject.com

UIKit - TableViewCellの高さについて

しばしブランクが合ったので、UITableViewCellの高さの設定が以前とちがっていました。
忘れないようにメモる。

UITableViewCellの高さが一定ならば、UITableViewのrowHeightプロパティに入れるだけで良い。

let tableView = UITableView()
tableView.rowHeight = 80 // 高さが一定値

UITableViewDelegateのheightForRowAtIndexPathに入れると、
セルの数だけ呼び出されるので無駄が多いとのこと。

qiita.com