Swift 3: не удается установить дополнительный Bool через отражение

#swift #reflection #swift3

#swift #отражение #swift3

Вопрос:

У меня есть следующий код с игровой площадки:

 class Result :NSObject {
    var success :Bool? = false
    var message :String? = ""
}

var result = Result()
print(result.message)
var value :Bool? = true
result.setValue(value, forKey: "success")
result.setValue("hello", forKey: "message")
print(result.message)
  

Этот код завершается ошибкой в первой result.setValue строке с сообщением «этот класс не соответствует кодированию ключевого значения для успешного ключа». Если я сделаю свойство success необязательным, тогда этот код будет работать нормально. Сообщение о свойстве работает нормально, независимо от того, является ли оно необязательным или нет.

Что здесь происходит? Есть ли какой-либо способ обойти это?

Ответ №1:

В Swift нет отражения. Вы используете отражение Objective-C. Необязательные типы значений ( BOOL , Int и т.д.) Не поддерживаются в Objective-C.

Комментарии:

1. Есть ли у вас какие-либо предложения по обходу этого? Должен ли я использовать NSNumber, например.

2. Оставляя NSObject setValue в стороне, в Swift есть отражение, по крайней мере, для самоанализа значений, например Mirror(reflecting: result).children.forEach { print($0) } .

3. @IanNewson NSNumber , безусловно, является правильным решением.

4. @dfri Это правда Mirror , даже задокументированная сейчас. Однако на самом деле я не считаю это готовым продуктом. Не то, что я бы осмелился использовать в производственном коде. Зеркала используются игровыми площадками и отладчиком. (цитирую документацию).