SwiftUI macOS 10.15 Toggle()にonChange()がない

macOS 10.15 Toggle() onChange

macOS 10.15 Catalina にも対応するアプリを SwiftUIで 作成する場合

Toggle()には onChange()が付いていません

onChange()が対応しているのは macOS 11.0以降のようです

struct test: View{
    @State var toggleStatus: Bool = false
    var body: some View {
        Toggle("Toggle", isOn: $toggleStatus).onChange(of: toggleStatus){newValue in
            
        }
    }
}

↑上記コードですと、 ↓下のエラーがでます。

x.swift:14:47: 'onChange(of:perform:)' is only available in macOS 11.0 or newer
'onChange(of:perform:)' is only available in macOS 11.0 or newer

Xcodeは、 @available(macOS 11.0, *) これで回避しろと言ってきます。

extension Binding で onChange() を作る

extension Binding {
    func onChange(_ action: @escaping () -> Void) -> Binding {
        Binding(get: {
            wrappedValue
        }, set: { newValue in
            wrappedValue = newValue
            action()
        })
    }
}
//@available(macOS 11.0, *)
struct test: View{
    @State var toggleStatus: Bool = false
    var body: some View {
        Toggle("Toggle", isOn: $toggleStatus.onChange {
            
        })
    }
}

Binding<T>が付いている SwiftUI部品ならなんでも利用できそうです。

Swift Date 時 分 秒 切り捨て

Swift Date 時 分 秒 切り捨て

Swift Date Calendarを使った時 分 秒 を切り捨てたい場合の コード例です。

日付のみを取り出す場合

let d = Date() //今
let x = Calendar.current.startOfDay(for: d) //日付のみを取り出す

秒 や 分 のみを 切り捨てる場合

let d = Data()
let calendar = Calendar(identifier: .gregorian)
let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: d)
let x = calendar.date(from: dateComponents)

上↑のコード例は 秒を 切り捨てています。 分まで切り捨てたい場合は、 dateComponents()部分の .minuteを消します。

CalendardateComponents 第一引数は Set<Calendar.Component>です。

enum Component には下記があります

.era, .year, .month, .day, .hour, .minute, .second
.weekday,.weekdayOrdinal,.quarter,.weekOfMonth,.weekOfYear
.yearForWeekOfYear,.nanosecond,.calendar,.timeZone

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED