0

ハッピーホリデー!

キーと値のペアでキーを定義するために使用されるプロパティ ラッパーがあります。

@propertyWrapper
final public class KeyValuePair<T> {
    public var wrappedValue: T?
    private(set) var key: String

    public init(key: String) {
        self.key = key
    }
}

編集: そして、すべてのKVモデルが準拠する必要がある次のプロトコルを使用して...

protocol Parametrized {
    var toParameters: [String: Any] { get }
}

プロパティ ラッパーは次のように使用されます。

struct Person: Parametrized {
    @KeyValuePair(key: "first_name") var firstName: String?
    @KeyValuePair(key: "last_name") var lasteName: String?
    @KeyValuePair(key: "age") var age: Int?
    @KeyValuePair(key: "isSingle") var isSingle: Bool?
    @KeyValuePair(key: "isOpenForDating") var isOpenForDating: Bool?
}

var missUniverse2022 = Person()
missUniverse2022.firstName = "Miss"
missUniverse2022.lastName = "Universe"
missUniverse2022.age = 23
missUniverse2022.isSingle = true // Rad <3
missUniverse2022.isOpenForDating = false // Sad :D

[String: Any]つまり、 Mirror を使用してその構造体からキーと値のペアを保持する型の辞書を生成するというのが全体的な考え方です。問題は、次のコードが機能しないことです (理由はわかっていますが、回避策がわかりません)。

extension Parametrized {
    var toParameters: [String: Any] {
        var parameters = [String: Any]()
        
        for child in Mirror(reflecting: self).children {
            
/***********************************************
Generic parameter 'T' could not be inferred in cast to 'KeyValuePair'
          
Explicitly specify the generic arguments to fix this issue
***********************************************/
            guard let kvPair = child.value as? KeyValuePair else { continue }
            
            parameters[kvPair.key] = kvPair.wrappedValue
        }
        
        return parameters
    }
}

そこで、ここで専門家に話を聞きます: ミラー ロジックを使用して kv ペアを取得し、それらをコレクションに入れる方法は?

あなたが提供できる助けに本当に感謝します。

4

1 に答える 1