読者です 読者をやめる 読者になる 読者になる

カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

swift3の時間操作サンプル

swift3
スポンサードリンク

小学生でもわかるiPhoneアプリのつくり方
f:id:InvokeTwoA:20151023183618p:plain「ついに、時を操る力を手に入れたぞ!」
f:id:InvokeTwoA:20151215172640p:plain「放置ゲーを作るためには時間関係の処理は避けられないですもんね」
f:id:InvokeTwoA:20151023183618p:plain「という訳でまずは基本の時計アプリを作ってみたよ」

swift3 での現在時刻表示

f:id:InvokeTwoA:20151023183618p:plain「時計アプリで検索すれば大量のサンプルが出てくるけど、swift2とかだとメソッド名が古いのばかり」
f:id:InvokeTwoA:20151215172640p:plain「この記事も数ヶ月後には古い記事になってしまうんでしょうかねぇ。そうやってネットデブリが増えて行く」

  • 現在日時を取得する方法

f:id:InvokeTwoA:20151023183618p:plain「まずは下記の表示をやってみよう!」
f:id:InvokeTwoA:20151215172640p:plain「イエスカッパ!」

2017/2/28/18:02
  • 日時を取得するメソッドは下記の通り
    // 現在の日時を文字列で返すメソッド
    func nowTime -> String (){
        let now = NSDate()
        let calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
        let units: NSCalendar.Unit = [.year, .month, .day, .hour, .minute, .second]
        let time_componetns = calendar.components(units, from: now as Date)

        let year = time_componetns.year!
        let month   = addZero(time_componetns.month!)
        let days    = addZero(time_componetns.day!)
        let hour    = addZero(time_componetns.hour!)
        let minutes = addZero(time_componetns.minute!)
        let second  = addZero(time_componetns.second!)
        
        let timer_string = "\(year)/\(month)/\(days)/\(hour)/\(minutes)/\(second)"
        print(timer_string)
        return timer_string
    }

    // 1桁だった場合、先頭に0を付ける
    func addZero(_ time: Int) -> String {
        let timeString = String(describing: time)
        if timeString.characters.count == 1 {
            return "0\(time)"
        } else {
            return "\(time)"
        }
    }

f:id:InvokeTwoA:20151023183618p:plain「圧倒的な let の羅列」
f:id:InvokeTwoA:20151215172640p:plain「letのバーゲンセールや!」
f:id:InvokeTwoA:20151023183618p:plain「これで現在時刻が取得できる」

毎秒ごとに時を刻んでいく

f:id:InvokeTwoA:20151023183618p:plain「1秒……1秒……秒針が時を刻む。  という表現が好きだ」
f:id:InvokeTwoA:20151215172640p:plain「他にも カチ……カチ……カチ…… 時が刻まれていく。  とかの表現も多いですな」
f:id:InvokeTwoA:20151023183618p:plain「とりあえず冒頭の文章に迷ったら時間の描写でもしとこうぜ、というのがラノベ界で学んだスキルだけどどうでも良いか」
f:id:InvokeTwoA:20151215172640p:plain「」

  • 毎秒ごとに時計を更新する処理は下記の通り
    // view が初めて呼ばれた時に行う処理
    override func viewDidLoad() {
        super.viewDidLoad()
        
        nowTime()
        _ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.nowTime), userInfo: nil, repeats: true)        
    }

f:id:InvokeTwoA:20151023183618p:plain「これで nowTime() を毎秒呼び続ける事ができる!」
f:id:InvokeTwoA:20151215172640p:plain「アプリを終了してる時は当然呼ばれません。当然ですけど」
f:id:InvokeTwoA:20151023183618p:plain「厳密には 0.99999……秒の誤差が発生する可能性があるけど、そんな時間を気にして生きてるようだと辛いからもっと楽に生きなよ って事で対応せず」
f:id:InvokeTwoA:20151215172640p:plain「市販のアプリでもそこら辺はアバウトでしたもんね。恐らくユーザーが気にしないであろう箇所に工数を割いても仕方ないスタイルですな」
f:id:InvokeTwoA:20151023183618p:plain「時計アプリなのに時間に厳密じゃない。それがカッパのクオリティ」

  • これで毎秒時を刻む処理が完成
  • 時間が1秒ずつ刻まれる様子が print されてるので、ログ見れば分かる

そして放置ゲームへ

f:id:InvokeTwoA:20151023183618p:plain「さて、ここで学んだ時間の技術を放置ゲームに活かすぞー!」
f:id:InvokeTwoA:20151215172640p:plain「そして気付いたのですが、データベースへの保存とか時間比較とかのため timestamp 形式の方が処理しやすい」
f:id:InvokeTwoA:20151023183618p:plain「という訳で time stamp で時間処理する場合の方法」

  • time stamp の取得
let timestamp = NSNumber(value:Int(Date().timeIntervalSince1970))
  • 日付に変換
        let timestamp = NSNumber(value:Int(Date().timeIntervalSince1970))
        let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(abbreviation: "GMT+9")
        dateFormatter.locale = NSLocale.current
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
        let strDate = dateFormatter.string(from: date)

        print(strDate)

f:id:InvokeTwoA:20151023183618p:plain「ふぅーっ。時間比較とかするなら NSCalendar よりもこっちの方が使いやすそう」
f:id:InvokeTwoA:20151215172640p:plain「ちなみに dateformat で ss と入力するたびにアマガミssを思い出しますな」

アマガミSS Blu-ray BOX

総括

f:id:InvokeTwoA:20151023183618p:plain「年末に、三日でアプリを作る〜 と宣言して今に至る」
f:id:InvokeTwoA:20151215172640p:plain「時の流れとは残酷ですな。しかし時間に関する記事をまとめたのでセーフ!」
f:id:InvokeTwoA:20151023183618p:plain「早くリリースしたいなぁ」