(я говорю «больше» в своем заголовке, потому что этот вопрос является приложением к моему Как Swift ReferenceWritableKeyPath работает со свойством Optional? .)
В моем коде self.iv
является свойством аутлета:
@IBOutlet weak var iv: UIImageView!
Теперь этот компилятор будет?
let im = UIImage()
let kp = \UIImageView.image
self.iv[keyPath:kp] = im // error
Нет! Нам говорят, что что-то здесь должно быть развернуто, хотя не совсем очевидно, что это:
Значение необязательного типа 'UIImage?' должно быть развернуто до значения типа 'UIImage'
Но теперь посмотрите на это. Вместо розетки я просто сделаю представление изображения:
let im = UIImage()
let kp = \UIImageView.image
let iv = UIImageView()
iv[keyPath:kp] = im
Это компилируется! Почему? Какая разница между семантией c / syntacti c между свойством UIImageView и локальным UIImageView? Является ли это свойство неявным образом развернутым Необязательным Необязательным?
Чтобы проверить эту идею, давайте «распространяем» развертывание self.iv
явно через локальное:
let im = UIImage()
let kp = \UIImageView.image
let iv = self.iv!
iv[keyPath:kp] = im
Это тоже компилируется! Но мы должны использовать отдельный локальный; просто развернуть self.iv
напрямую недостаточно:
let im = UIImage()
let kp = \UIImageView.image
self.iv![keyPath:kp] = im // error
Я совсем не понимаю этого. Это идет вразрез с моими стандартными представлениями о том, что такое неявно развернутый необязательный параметр, и о том, как необязательный необязательно всегда можно назначить для необязательного обертывания того же типа. Что-то в ReferenceWritableKeyPath, кажется, странно работает с необязательными свойствами, но я не могу это указать.
Поэтому мой вопрос (извините, может быть, немного расплывчатый): может кто-то обосновать все эти результаты и заставить их казаться рационально и предсказуемо? Какие здесь правила?
ПРИМЕЧАНИЕ: Может совпадать с https://bugs.swift.org/browse/SR-11184