Tometoyou
Tometoyou

Reputation: 8386

Set value of array via KeyPath

I am trying to update the value stored in an array property of a class via the use of KeyPaths. Here is my code:

func listenAndUpdateDocuments<T: JSONDecodable>(
    _ property: ReferenceWritableKeyPath<MyModel, [T]?>,
    from model: MyModel) {
    guard let reference = reference else {
        return
    }
    guard listener == nil else {
        return
    }
    listener = backendClient.listenToDocuments(reference) { [weak model] (result: Result<[T], RequestError>) in
        switch result {
        case .success(let value):
            model?[keyPath: property] = value
        case .failure:
            model?[keyPath: property] = []
        }
    }
}

The problem is when I call this function like this:

myListener.listenAndUpdateDocuments(\.viewers, from: self)

where viewers is of type [ViewersModel], it always comes back with the following error:

Type of expression is ambiguous without more context

How do I solve this? I have a similar version of the code but where the property parameter isn't an array, and that works.

Upvotes: 0

Views: 279

Answers (1)

16cups
16cups

Reputation: 23

I struggled with something similar:

_ = Token.query(on: req).filter(\.expiry < Date()).delete()

The solution I found was to use a more up-to-date api to handle my request parameters.

_ = Token.query(on: req).filter(\.expiry, .lessThan, Date()).delete()

It had less to do with the keypath itself than I thought!

Upvotes: 0

Related Questions