magukappu
@magukappu (yama)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

規定の時間に達したと同時に音を鳴らしたい

規定の時間に達したと同時に音を鳴らしたい

SwiftUIを始めてから1ヶ月の初心者です。
現在年越しのタイマー的なものを作っていて、if文で音が鳴るようにしたいのですが書き方が
わかりません。
どうすればif文で規定の時間に音を鳴らすようにできるでしょうか?

ちなみにまだ秒換算しかできていません。

該当するソースコード

import SwiftUI
import Foundation
struct ContentView: View {
    
    let dateFormatter = DateFormatter()
    
    init() {
        dateFormatter.dateFormat = "YYYY/MM/dd(E) \nHH:mm:ss"
        dateFormatter.locale = Locale(identifier: "ja_jp")
    }
    
    @State private var isPowerOn = false
    
    @State var dateText = ""
    
    @State var nill = ""
    
    @State var date = Date()
    
    @State var date1 = Calendar.current.date(from: DateComponents(year: 2023, month: 1, day: 1, hour: 0, minute: 0))
    @State var diffText = ""

    var body: some View {
        VStack {
            Text("現在時刻")
                .font(.system(size: 44.0))
            Text(dateText.isEmpty ? "\(dateFormatter.string(from: date))" : dateText)
                    .onAppear {
                        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
                            self.date = Date()
                            dateText = "\(dateFormatter.string(from: date))"
                    }
                }
            Text("年越しタイマー")
                .font(.system(size: 44.0))
                .foregroundColor(Color(red: 0.76, green: 0.57, blue: 0.72, opacity: 1))

            Text("あと")
                .font(.system(size: 44.0))
            
            let diff = (String(date1!.timeIntervalSince(date)))
           
            Text("\(diff)秒で")
            Text("年を越すよ!")
                .font(.system(size: 44.0))
            
            
                }
            }
        }
//    }
    
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
//}
1

1Answer

コード

import SwiftUI
import Foundation
import AudioToolbox

struct ContentView: View {

    let dateFormatter = DateFormatter()

    init() {
        dateFormatter.dateFormat = "YYYY/MM/dd(E) \nHH:mm:ss"
        dateFormatter.locale = Locale(identifier: "ja_jp")
    }

    @State private var isPowerOn = false

    @State var dateText = ""

    @State var nill = ""

    @State var date = Date()

    @State var date1 = Calendar.current.date(from: DateComponents(year: 2023, month: 1, day: 1, hour: 0, minute: 0))
    @State var diffText = ""

    var body: some View {
        VStack {
            Text("現在時刻")
                .font(.system(size: 44.0))

            Text(dateText.isEmpty ? "\(dateFormatter.string(from: date))" : dateText)
                .onAppear {
                    Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
                        self.date = Date()
                        dateText = "\(dateFormatter.string(from: date))"

                        if Date() >= date1! {
                            AudioServicesPlaySystemSound(1000)
                        }
                    }
                }

            Text("年越しタイマー")
                .font(.system(size: 44.0))
                .foregroundColor(Color(red: 0.76, green: 0.57, blue: 0.72, opacity: 1))

            Text("あと")
                .font(.system(size: 44.0))

            Text("\(timeLimit)秒で")

            Text("年を越すよ!")
                .font(.system(size: 44.0))
        }
    }

    private var timeLimit: String {
        var calendar = Calendar.current
        calendar.locale = Locale(identifier: "ja_JP")

        let formatter = DateComponentsFormatter()
        formatter.calendar = calendar
        formatter.unitsStyle = .full
        formatter.allowedUnits = [.day, .hour, .minute, .second]
        formatter.zeroFormattingBehavior = [.dropLeading]

        let string = formatter.string(from: date1!.timeIntervalSince(date))!
        return string
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

解説

残り時間を計算

    private var timeLimit: String {
        var calendar = Calendar.current
        calendar.locale = Locale(identifier: "ja_JP")

        let formatter = DateComponentsFormatter()
        formatter.calendar = calendar
        formatter.unitsStyle = .full
        formatter.allowedUnits = [.day, .hour, .minute, .second]
        formatter.zeroFormattingBehavior = [.dropLeading]

        let string = formatter.string(from: date1!.timeIntervalSince(date))!
        return string
    }

規定の時間に達したと同時に音を鳴らす

import AudioToolbox
if Date() >= date1! {
    AudioServicesPlaySystemSound(1000)
}
1Like

Comments

  1. @magukappu

    Questioner

    この場合のif文はこう書けばいいのですか、勉強になります!このような情報が少ないこの質問を解決してくれてありがとうございます!
    あともう一つ質問があり、どうやって残り時間を日、時間、秒にする方法を暇があればなんですが細かく教えてください
  2. この関数で日、時間、秒に変換されてますよ!

    ```swift
    private var timeLimit: String {
    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "ja_JP")

    let formatter = DateComponentsFormatter()
    formatter.calendar = calendar
    formatter.unitsStyle = .full
    formatter.allowedUnits = [.day, .hour, .minute, .second]
    formatter.zeroFormattingBehavior = [.dropLeading]

    let string = formatter.string(from: date1!.timeIntervalSince(date))!
    return string
    }
    ```
  3. @magukappu

    Questioner

    formatter.allowedUnits = [.day, .hour, .minute, .second]の部分で日、時間、秒にしているですか、なるほどわざわざありがとうございます!

Your answer might help someone💌