Swift - Swift2.0でもstringByAppendingPathComponentが使いたい
StringをNSStringに変換してあげれば使うことができます。
NSString(string: "hoge").stringByAppendingPathComponent("fuga") => hoge/fuga
参考:
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型になるので、小数点の答えも出るのではないかと思います。
参考:
UIKit - TableViewCellの高さについて
しばしブランクが合ったので、UITableViewCellの高さの設定が以前とちがっていました。
忘れないようにメモる。
UITableViewCellの高さが一定ならば、UITableViewのrowHeightプロパティに入れるだけで良い。
let tableView = UITableView() tableView.rowHeight = 80 // 高さが一定値
UITableViewDelegateのheightForRowAtIndexPathに入れると、
セルの数だけ呼び出されるので無駄が多いとのこと。