Подробнее о странном поведении ReferenceWritableKeyPath с необязательным свойством - PullRequest
2 голосов
/ 08 января 2020

(я говорю «больше» в своем заголовке, потому что этот вопрос является приложением к моему Как 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

...