

特定の時間になるとタイマーを鳴らしたいです。その手段としてcalendar型を使用したいのですが,エラー表示が出てうまくできません。具体的にエラーの部分は、以下の３つです。

エラー１

[code]

    calendar.timeZone = .current
    //エラー
    Consecutive declarations on a line must be separated by ';'
    
    Expected '(' in argument list of function declaration
    
    Expected '{' in body of function declaration
    
    Expected 'func' keyword in instance method declaration
    
    Expected declaration
    
    Invalid redeclaration of 'calendar()'
    
[/code]

エラー２

[code]

    let condition1 = calendar.date(from: DateComponents(year: 2021, month: 2, day: 11, hour: 9, minute: 00, second: 00))!
    //エラー
    Cannot use instance member 'calendar' within property initializer; property initializers run before 'self' is available
    
[/code]

エラー３

[code]

    //
    if now > codition1
    //エラー
    Expected declaration
    //
    
    //ソースコード
    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        var audioPlayer: AVAudioPlayer!
    
            override func viewDidLoad() {
                super.viewDidLoad()
                    // Do any additional setup after loading the view.
            }
    
        // 現在の日付を得る
        let now = Date()
            // タイマー起動時間を設定する
            var calendar = Calendar(identifier: .gregorian)
            calendar.timeZone = .current
            calendar.locale = .current
            let condition1 = calendar.date(from: DateComponents(year: 2021, month: 2, day: 11, hour: 9, minute: 00, second: 00))!
    
            if now > codition1 {
                playSound(name: "onsei")
            }
    
    }
    
    extension ViewController: AVAudioPlayerDelegate {
        func playSound(name: String) {
            guard let path = Bundle.main.path(forResource: name, ofType: "m4a") else {
                print("音源ファイルが見つかりません")
                    return
            }
            do {
                // AVAudioPlayerのインスタンス化
                audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                    // AVAudioPlayerのデリゲートをセット
                    audioPlayer.delegate = self
                    // 音声の再生
                    audioPlayer.play()
            } catch {
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-02-01T18:29:45.420
73742
2021-02-02T00:30:21.250
2021-02-02T00:13:39.047
3060
43783
question
swift ios iphone
音声ファイルの時間指定再生


「その手段としてcalendar型を使用したいのですが,エラー表示が出てうまくできません」の部分についてのみ回答します。

「特定の時間になるとタイマーを鳴らしたい」と言うのはコードの意図を明確化するための注釈と考えていますが、もしそれ自体について質問したいのであれば、
**そもそもiOSでそんなことが実現できるのか** を調べた上で、このスレッドとは別に新しいスレッドを起こされた方がいいでしょう。

* * *

あなたのコードにおいて`let now = Date()`や`var calendar = Calendar(identifier:
.gregorian)`は変数宣言に当たりますが、`calendar.timeZone = .current`のような式は、宣言ではなく実行文になります。

これはSwiftに限らず、クラスベースの多くの言語について共通ですが、

## 実行文はメソッド内など特定の場所にしか書けません

あなたが書かれた実行文はメソッド内には置かれていませんので、それがエラーの原因です。

(「もうちょっとそのことがわかるようなエラーメッセージを出すべきだ」とお思いでしたら、bugs.swift.org にバグ報告を送りましょう。)

* * *

例えば、以下のように、何かのメソッドを作って、実行文を含む文一切をメソッドの中に移動させればエラーは出なくなります。

[code]

    class ViewController: UIViewController {
        //...
    
        func checkTimeToPlaySound() {
            // 現在の日付を得る
            let now = Date()
            // タイマー起動時間を設定する
            var calendar = Calendar(identifier: .gregorian)
            calendar.timeZone = .current
            calendar.locale = .current
            let condition1 = calendar.date(from: DateComponents(year: 2021, month: 2, day: 11, hour: 9, minute: 00, second: 00))!
            
            if now > condition1 { //<- ここは`condition1`
                playSound(name: "onsei")
            }
        }
    }
    
[/code]

ただし、このメソッド`checkTimeToPlaySound()`は、誰かが呼んでやらないと、あるいは「誰かに呼ばせるように設定してやらないと」決して実行されることはありません。

(例えば`viewDidLoad()`なんかは「iOSが特定のタイミングで呼んでくれる」ようになっています。)

* * *

iOSなどの複雑なGUIフレームワークで管理された環境用のプログラムを書くとき、「適当な場所にそれっぽいコードを書けば、後はシステムが良い感じに実行してくれる」なんてことは決して起きません。

  * いつどこで実行させたいのかを明確にして、その条件で実行されるメソッド内にコードを書く
  * そんなメソッドがなければ、その条件で実行されるように設定してやる

と言ったことが必要です。2点目の「その条件で実行されるように設定」については、どうしたら設定できるのか、(あるいは、どうやったって無理なのか)調べた上で別途質問してください。


CC BY-SA 4.0
2021-02-02T00:30:21.250
73745
2021-02-02T00:30:21.250
13972
73742
answer