#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
, даже задокументированная сейчас. Однако на самом деле я не считаю это готовым продуктом. Не то, что я бы осмелился использовать в производственном коде. Зеркала используются игровыми площадками и отладчиком. (цитирую документацию).