Swift書いてて最近つまづいた4つのコト
最近Swiftを書く機会があったのですが,久々に書くとホント色々な場面でつまづきます.
Swiftは新しい言語のため,ググっても解決方法がなかなか見つからないこともしばしば…
そこで,最近つまづいた4つのことを解決方法と共に紹介します.
Dictionaryをvalueの値でソートする
次のようにDictionaryを拡張し,keysSortedByValue
という独自の関数を実装します.
extension Dictionary { func keysSortedByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] { var array = Array(self) sort(&array) { let (lk, lv) = $0 let (rk, rv) = $1 return isOrderedBefore(lv, rv) } return array.map { let (k, v) = $0 return k } } }
そして,次のように書けばソートできます.
let dict = ["a":1, "c":3, "b":2] let ascDict = dict.keysSortedByValue(<) // 昇順ソート let desDict = dict.keysSortedByValue(>) // 降順ソート
以下を参考にさせていただきました.
(ソースコードは下記に掲載されているものを一部変更したものです)
Viewに背景画像を指定する
view.backgroundColor = UIColor(patternImage: UIImage(named: "background.png"))
背景色を設定する時と同様にUIColor
を使います.
これは,以下の記事に解決方法が記述されていました.
日時の差分(経過時間)を取得する
2つのNSDate型で表された日時の差分を,NSDate#timeIntervalSinceDate
関数で取得できます.
NSTimeInterval
という型が返されるのですが,これはFloat
型にキャストできます.
以下にサンプルを示しておきます.
date1
の5秒後の時間がdate2
に格納されるので,出力される時間もおよそ5秒になります.
// 現在日時を取得 var date1 = NSDate() // 5秒待つ sleep(5) // 現在日時を取得 var date2 = NSDate() // date1からの経過時間を取得 var time = Float(date2.timeIntervalSinceDate(date1)) // 経過時間を表示 println(time)
これは,以下を参考にさせていただきました.
バイブを鳴らす
import AVFoundation
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
事前に,標準で入っているAVFoundation.framework
を追加しておく必要があります.
以下を参考にさせていただきました.
おわりに
どれも大したことではないはずなのですが,普段あまりSwiftを書かないので,いざ使うとなると細々したことでハマりまくります.
しかも,ググっても英語の記事が多く引っかかるので苦労します.実際,今回も4分の2が英語(Stack Overflow)です.
英語もっと勉強しとけばよかったなーとつくづく思うばかりです^^;