Swift ジェネリクス型で switch判定

Swift ジェネリクス型switch判定

Swiftジェネリクス型という言い方が正しいのか? とも思ったが

公式に Genericsと書いていたので 従うことにします。

下↓のコード の引数obj :Tの型でswitchする コード例です。

struct A: Codable{ var a: String}
struct B: Codable{ var b: String}

func test<T>(_ obj: T) -> String{
	switch type(of:obj) {
	case is String.Type:
		return obj as! String
	case is Int.Type:
		return String( obj as! Int )
	case is A.Type:
		let anser:String = (obj as! A).a
		return anser
	case is B.Type:
		let anser:String = (obj as! B).b
		return anser
	default:
		return ""
	}
}
    
var resultStr = ""
resultStr = test(Int(123))
resultStr = test("abc")
resultStr = test(A(a: "Codable A"))
resultStr = test(B(b: "Codable B"))
print(resultStr)

test<T>()というファンクションで 引数obj が Stringか Intもしくは struct AかBかをswitch判定しています。

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部品ならなんでも利用できそうです。

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED