Swift iOS - как динамически добавлять свойства в существующий класс и получать к ним доступ - PullRequest
0 голосов
/ 17 января 2019

Мне нужно динамически добавить свойства в существующий класс, а затем получить к ним доступ. Я нашел этот ответ , используя objc_setAssociatedObject, но нет контекста, как его использовать. Как мне этого добиться?

let dict = ["orderId":"abc", "postId+0":"zero", "postId+1":"one", "postId+2":"two"] // postIds can go on

let order = Order(dict: dict)
let dynamicProperties = order.accessDynamicProperties()
print(dynamicProperties)

Класс:

class Order {

    var orderId: String?

    // I have a main initilizer that I use for something else that's why I'm using a convenience init
    convenience init(dict: [String: Any]) {
        self.init()

        orderId = dict["orderId"] as? String

        dynamicallyCreateProperties(dict: dict)
    }

    func dynamicallyCreateProperties(dict: [String: Any]) {

        for (key, value) in dict {

            if key.contains("+") {

               // dynamically add property and value to class
            }
        }
     }

     // returns something???
     func accessDynamicProperties() -> ??? {

     }
}

1 Ответ

0 голосов
/ 17 января 2019

Используя предложение @DonMag в комментариях, он дал мне отличную альтернативу. Он предложил создать словарь как свойство класса, а затем добавить в него пары ключ-значение.

class Order {

    var orderId: String?

    var dynamicDict = [String: Any]()

    convenience init(dict: [String: Any]) {
        self.init()

        orderId = dict["orderId"] as? String

        createDynamicKeyValues(dict: dict)
    }

    func createDynamicKeyValues(dict: [String: Any]) {

        for (key, value) in dict {

            if key.contains("+") {

                dynamicDict.updateValue(value, forKey: key)
            }
        }
    }
}

Чтобы использовать это:

let dict = ["orderId":"abc", "postId+0":"zero", "postId+1":"one", "postId+2":"two"] // postIds can go on

let order = Order(dict: dict)

for (key, value) in order.dynamicDict {
    print(key)
    print(value)
}
...