2017-01-18 3 views
0

Рассмотрите следующее.Предупреждение при переопределении открытого var внутри расширения fileprivate в swift

fileprivate extension UIButton { 
    override open var isSelected: Bool { 
     didSet { 
      self.titleLabel?.font = isSelected ? UIFont(name: "HelveticaNeue-Medium", size: 14) : UIFont(name: "HelveticaNeue-Light", size: 14) 
     } 
    } 
} 

Через некоторое время появляется предупреждение в Xcode, который просит меня изменить «открыть» для fileprivate. Конечно, если я это сделаю, то я не переопределяю одну и ту же переменную isSelected от UIButton, и я получаю сообщение об ошибке.

Является ли это ошибкой XCode? Я не могу сделать расширение общедоступным или внутренним, так как поведение изменит все UIButtons в приложении. Любые идеи?

Update:

Точное предупреждение это. enter image description here

+0

Какое точное предупреждение вы получили? – TheAmateurProgrammer

+0

Декларация совершенно верна и работает по назначению. Предупреждение неверно. –

+0

Предупреждающее сообщение неверно из-за ошибки в файле сообщений компилятора, это должно быть «Объявление OPEN var в расширении fileprivate», см. Http://stackoverflow.com/questions/40983010/cannot-override-open-method- объявленный в классе-extension-in-another-module-swift для аналогичной проблемы. В качестве решения вы можете удалить 'fileprivate' из' extension'. –

ответ

3

Самое забавное, что Swift на самом деле позволяет это сделать. Я считаю, что намеренно нельзя переопределять общедоступные методы в приватном (fileprivate) контексте.

Он неоднозначен, что вы действительно хотите:

В вашем случае вы переопределить метод в контексте, который только SCOPES на сам файл. Можно подумать, что переопределение будет применяться только к кнопкам внутри этого файла, но это неверно. Теперь каждая кнопка в вашем приложении будет иметь переопределенный метод (протестировал его). Таким образом, ваше решение, безусловно, должно иметь этот метод переопределить внутри публично открытого расширения.

Примечание: Я знаю, что это свойство, а не метод, но за кулисами - это метод, который запускается после вызова сеттера объекта.

+0

Мой разум взорван. Это действительно доступно везде! Тогда почему же существуют расширения fileprivate? –

+1

@L_Sonic Не для переопределения. Он предназначен для подклассов или для создания классов fileprivate. Даже для реализации публичных протоколов. Используйте подкласс в вашем случае. Также позвольте мне поделиться с вами советом, который вы редко увидите: когда дело доходит до создания расширений классов, которые не являются вашими (такими как UIButton), избегайте любой ценой! Серьезно, никогда не делайте этого, если нет другого способа создать свое решение. –

+0

Кажется чище, чем подклассификация всего класса, просто чтобы изменить шрифт. Спасибо за совет! –

Смежные вопросы