0

I've got a list of instances of the following struct called payment_list:

struct Payment: Codable {

    let id: Int
    let payment_hash: String
    let destination: String
    let msatoshi: Int
    let timestamp: Int
    let created_at: Int
    let status: String

    enum PaymentKeys: String, CodingKey {
        case payments
    }
}

I can access the members of each struct instance in the list in the following manner:

print(payment_list[0].id)        // 1 
print(payment_list[0].timestamp) // 1517083775

Is it possible to access those struct instance members using a variable to determine which member is being accessed? Something along the lines of:

var column = "id"
print(payment_list[0][column]) // 1

I've read about people using NSObject and value(forKey key: String), but this is a struct so it can't inherit from NSObject. If it was an object I think it would look something like this:

var column = "id"
print(payment_list[0].value(forKey key: column)) // 1

Is this type of thing possible with struct?

1 Answer 1

4

Swift 4 added support for key paths, which allow to do something similar to what you want:

let keyPath: KeyPath<Payment, Int> = \Payment.id
var payment = Payment(id: 42)
let value = payment[keyPath: keyPath] // returns 42

A key path has two generic parameters: first the type it operates on (in your example Payment), and the type of the property it accesses (Int). Note that you'll have to specify the key path for every property you want to access.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.