16738


Swiftで、指定した時間までの残り時間をカウントダウンするプログラムを書いています。  
しかしxcode上でも、playground上でも

[code]

    let myComponetns = myCalendar.components(NSCalendarUnit.CalendarUnitYear   | 
            NSCalendarUnit.CalendarUnitHour   | 
            NSCalendarUnit.CalendarUnitMinute | 
            NSCalendarUnit.CalendarUnitSecond , 
            fromDate: myDate) 
    
[/code]

の部分で

> NSCalanderUnit has no member"CalanderUnitYear"

とエラーが出ます。

また、

> myInt = myStr.toInt()! Ambiguos reference to member "String.init"

と表示されます、

原因がわからない状態です、ご指導願えますでしょうか

[code]

    import UIKit 
    
    class ViewController: UIViewController { 
    
        var cnt : Int = 0 
        var timer : NSTimer! 
        var myInt:Int = 0 
    
        override func viewDidLoad() { 
    
            let myDate: NSDate = NSDate() 
            let myCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
            let myComponetns = myCalendar.components(NSCalendarUnit.CalendarUnitYear   | 
                NSCalendarUnit.CalendarUnitHour   | 
                NSCalendarUnit.CalendarUnitMinute | 
                NSCalendarUnit.CalendarUnitSecond , 
                fromDate: myDate) 
    
            timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "onUpdate:", userInfo: nil, repeats: true) 
            timer.fire() 
    
            var myStr: String = "\(myComponetns.hour)" 
            myStr += "\(myComponetns.minute)" 
            myStr += "\(myComponetns.second)" 
    
            myInt = myStr.toInt()! 
    
        } 
    
        func onUpdate(timer : NSTimer){ 
            cnt += 1 
            let count = myInt - cnt 
            println(count) 
        } 
    
    } 
    
[/code]


CC BY-SA 3.0
2015-09-18T04:07:47.693
16736
2015-10-16T16:16:21.910
2015-10-16T16:16:21.910
5519
12254
question
swift
iOS(Swift)で残り時間をカウントダウンするアプリを作りたい


エラーが出ないように、書き換えてみました。 _開発環境は、Xcode 7.0 + Swift 2.0 + iOS 9です。先日Xcode
7が正式にリリースされました。古い環境の場合、その旨但し書きしていただいた方がいいのではないかと思います。_

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        var cnt : Int = 0
        var timer : NSTimer!
        var myInt:Int = 0
    
        override func viewDidLoad() {
    
            let myDate: NSDate = NSDate()
            let myCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
            let myComponetns = myCalendar.components(NSCalendarUnit(rawValue: NSCalendarUnit.Year.rawValue   |
                NSCalendarUnit.Hour.rawValue   |
                NSCalendarUnit.Minute.rawValue |
                NSCalendarUnit.Second.rawValue) ,
                fromDate: myDate) // 注
    
            timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "onUpdate:", userInfo: nil, repeats: true)
            timer.fire()
    
            var myStr: String = "\(myComponetns.hour)"
            myStr += "\(myComponetns.minute)"
            myStr += "\(myComponetns.second)"
    
            myInt = Int(myStr)! // toInt()がSwift2より無効になったようです。
    
        }
    
        func onUpdate(timer : NSTimer){
            cnt += 1
            let count = myInt - cnt
            print(count) // println()は、Swift2よりDeprecatedになりました。
        } 
    
    }
    
[/code]

出力：

> -1  
>  134515  
>  134514  
>  134513  
>  134512  
>  134511  
>  134510  
>  134509  
>  134508  
>  134507  
>  134506  
>  134505  
>  134504（以下省略）

なんとなく、希望どおりの出力でないみたいですが、とりあえずエラーは出なくなります。

注：  
`NSCalendarUnit`は、Objective-
Cでは`enum`ですが、Swiftでは`struct`（構造体）です。なので、ビット演算（OR）による結合はできません。ここでは、いったん`UInt`に変換（`rawValue`）し、ビット演算（OR）で結合し、それを`init(rawValue
rawValue: UInt)`で`NSCalendarUnit`に戻しています。もっとスマートな方法がありそうですが、とりあえずこう処理しました。  
それと`NSCalendarUnit.CalendarUnitYear`という書き方はなく、正しくは`NSCalendarUnit.Year`です。NSCalendarのリファレンスを読み直してください。


CC BY-SA 3.0
2015-09-18T05:12:11.327
16738
2015-09-18T11:15:18.640
2015-09-18T11:15:18.640
7362
7362
16736
answer