macOS SwiftUI DatePicker カレンダー 最大値 / 最小値 Range

macOS SwiftUI で DatePickerの 最大値と最大値をClosedRangeで指定する方法コード例です。

SwiftUIDatePickermacOSで使う 下記は シンプルなコード例

struct ContentView: View {
    @State var d1: Date = Date()
    @Binding var title: String
    var body: some View {
        ZStack{
            Color.clear.frame(width: 350, height: 200)
            VStack{
                DatePicker("日時", selection: $d1).frame(width: 300)
                Spacer().frame(height: 150)
            }
        }
    }
}
macOS DatePicker例

↓下記は、 DatePicker の最大値と最小値を設定するコード例です

struct ContentView: View {
    @State var d1: Date = Date()
    @Binding var title: String
    @State var target:Date = Date()
    var dateClosedRange: ClosedRange<Date> {
        let min = Calendar.current.date(byAdding: .day, value: -7, to: target)! //7日前
        let max = Calendar.current.date(byAdding: .day, value: 1, to: target)!  //1日後
        return min...max
    }

    var body: some View {
        ZStack{
            Color.clear.frame(width: 350, height: 200)
            VStack{
                DatePicker("日時", selection: $d1, in: dateClosedRange).frame(width: 300)
                Spacer().frame(height: 150)
            }
        }
    }
}

DatePicker の “in” に ClosedRange<Date>で最大値と最小値を指定しています。

DatePicker の "in" に ClosedRange<Date>で最大値と最小値を指定

Swift スコープ内Finally的なステートメント defer

Swift スコープ内Finally的なステートメント defer

deferはスコープを出る直前に実行できるコードを指定できます。Finally的な使い方ができます。Unsafeなallocate()をdeallocate()する場合に便利です。

public func test() -> Void{
	defer { print("Start defer") }
	print("Start Function")
}

上記コード例の場合結果は下のようになります。

public func test() -> Void{
	defer { print("Start defer 1") }
	defer { print("Start defer 2") }
	print("Start Function")
}

上記コードのようにdeferを複数いれることもできます。

この場合の結果は下記です。

Start Function
Start defer 2
Start defer 1

“Start defer 1”が一番最後に実行されました。

deferは、for などのスコープ内で利用することもできます。

public func test() -> Void{
	for i in [1,2,3] {
		defer { print("Statement defer \(i)") }
		print("Statement \(i)")
	}
	defer { print("Function defer") }
	print("Function Start")
}

上記コードを実行した場合下記のような結果でした。

Swift 文字列の㌫エンコード/デコード

addingPercentEncoding

Swiftの文字列(String)には、addingPercentEncoding()という関数が用意されています。これを使えばを文字列から㌫エンコードすることができます。エンコードされた文字列は、%E3%81%82のようなURLのQueryでよく見かけるフォーマットです。

let s = "不思議の国のトムキンス".addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
print(s)

上記コードは、addingPercentEncoding()のコード例です%E4%B8%8D%E6%80%9D%E8%AD%B0%E3%81%AE%E5%9B%BD%E3%81%AE%E3%83%88%E3%83%A0%E3%82%AD%E3%83%B3%E3%82%B9と出力されます

このパーセントエンコードされた文字列をもとに戻すにはremovingPercentEncodingを使います。removingPercentEncodingは、String内にある関数です

let s = "%E6%80%AA%E7%8D%A3%E2%AD%90".removingPercentEncoding
print(s as Any)