Расширение скрывает свойство, к которому я хочу получить доступ. Обходные пути?

Я использую два модуля: DropDown и SwiftyUtils.

DropDown добавляет подкласс UIView под названием DropDown. Класс DropDown определяет собственное свойство width. Вместо установки frame код клиента должен установить ширину выпадающего меню, используя это свойство. Он определяется следующим образом:

public var width: CGFloat? {
    didSet { setNeedsUpdateConstraints() }
}

SwiftyUtils, с другой стороны, добавил расширение ко всем UIViews. В расширении также есть свойство width. Это свойство width просто возвращает frame.width, чтобы люди могли писать меньше кода. Он определяется следующим образом:

public var width: CGFloat {
    get { return frame.width }
    set { frame = frame.with(width: newValue) } // frame.with() is defined in SwiftyUtils as well
}

Проблема возникает, когда я пытаюсь установить ширину меню DropDown, используя свойство width, определенное в DropDwon. Компилятор считает, что я имею в виду свойство width, определенное в расширении в модуле SwiftyUtils.

Как я могу сообщить компилятору, что я имею в виду width в DropDown, а не width в SwiftyUtils?


person Sweeper    schedule 11.02.2017    source источник


Ответы (1)


Я решил эту проблему с помощью небольшой хитрости.

width в DropDown имеет тип CGFloat?, но width в SwiftyUtils имеет тип CGFloat. Это означает, что если я передам необязательный CGFloat, компилятор поймет, что я имел в виду width в DropDown.

Итак, вместо этого:

let menuWidth = <insert calculation here>
menu.width = menuWidth

Я сделал это:

let menuWidth = <insert calculation here>
menu.width = menuWidth as CGFloat?
person Sweeper    schedule 11.02.2017