Как установить значение переменной члена, используя отражение в Swift? - PullRequest
0 голосов
/ 25 февраля 2019

Я прочитал множество учебных пособий и попробовал множество вещей, чтобы заставить это работать, но, похоже, не могу найти решение.

Все, что я хочу сделать, это использовать отражение, чтобы установить значение для именованногопеременная-член.Я могу прочитать значения просто отлично, но как мне записать значение?

Вот мой пример кода:

class MyObject
{
    public var myString : String = "Not working"
}

func test()
{
    let value = "It works!"
    let member = "myString"
    var myObject = MyObject()

    let mirror = Mirror(reflecting: myObject)
    for (_, var attr) in mirror.children.enumerated() {
        if attr.label == member {
            print("Setting value of \(member)")

            // attempt to set the member variable value
            attr.value = value

            break
        }
    }

    print("New value: \(myObject.myString)")
}

ЗапускВ этом примере выходные данные выводят старое значение myString.Я использую Swift 4 для iOS.

Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

К сожалению, вы не можете изменить значение с помощью Mirror при базовом использовании этого.

Вы можете сделать это без отражения, если оно приемлемо для вас:

class MyObject: NSObject
{
    @objc public var myString : String = "Not working"
}

func test()
{
    let value = "It works!"
    let member = "myString"
    let myObject = MyObject()

    myObject.setValue(value, forKey: member)

    print("New value: \(myObject.myString)")
}

ИЛИ

Взгляните на это: Отражение

Надеюсь, это поможет вам.

0 голосов
/ 25 февраля 2019

Возможности отражения Swift основаны на struct, называемом Mirror.Вы создаете зеркало для определенного subject, а затем зеркало позволит вам запросить его.

Имеется в виду Mirror, в котором вы не можете изменить subject MyObject.

Читать ЗДЕСЬ для получения дополнительной информации.

РЕДАКТИРОВАТЬ:

Вы можете просто обновить свойство класса, как показано ниже:

func test() {

    let myObject = MyObject()
    myObject.myString = "It works!"
    print("New value: \(myObject.myString)") // "New value: It works!"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...