しろかい!

アプリ開発や機械学習などの開発Tips.

Swift書いてて最近つまづいた4つのコト

最近Swiftを書く機会があったのですが,久々に書くとホント色々な場面でつまづきます.
Swiftは新しい言語のため,ググっても解決方法がなかなか見つからないこともしばしば…
そこで,最近つまづいた4つのことを解決方法と共に紹介します.

f:id:shun9167:20150121155619p:plain

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)です.

英語もっと勉強しとけばよかったなーとつくづく思うばかりです^^;