Swift 2, метод 'setOn' с селектором Objective-C 'setOn:' конфликтует с setter для 'on' с тем же селектором Objective-C

Swift 2, у меня есть класс, наследуемый от UIView objc, и у него есть переменная «on», а связанные методы «setOn: анимированные» и «setOn:», как показано ниже:

public class AView: UIView { var on: Bool = false public func setOn(on: Bool, animated: Bool) { self.on = on // do something more about animating } public func setOn(on: Bool) { setOn(on, animated: false) } 

И у меня появилось сообщение об ошибке: method 'setOn' with Objective-C selector 'setOn:' conflicts with setter for 'on' with the same Objective-C selector

Я думаю, что willSet или didSet не является решением, потому что setOn:animated: вызывается дважды, даже если я добавляю некоторые условия защиты:

 var on: Bool = false { willSet { if self.on != newValue { setOn(self.on, animated: false) } } } .... .... let a = AView() a.setOn(true, animated: true) // setOn:animated: is called twice 

Есть ли решение без изменения имени переменной и имени метода?


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

 private var isOn: Bool = false var on: Bool { set(newOn) { setOn(newOn, animated: false) } get { return isOn } } public func setOn(on: Bool, animated: Bool) { self.isOn = on // do something ... } 

2 Solutions collect form web for “Swift 2, метод 'setOn' с селектором Objective-C 'setOn:' конфликтует с setter для 'on' с тем же селектором Objective-C”

Точно так же, как в ошибке компилятора: метод с селектором Objective-C конфликтует с предыдущим объявлением с тем же селектором Objective-C , вы также можете скрыть свойства из среды выполнения Objective-C с помощью @nonobjc :

 public class AView: UIView { @nonobjc var on: Bool = false public func setOn(on: Bool, animated: Bool) { self.on = on // do something more about animating } public func setOn(on: Bool) { setOn(on, animated: false) } } 

который предотвращает автогенерирование конфликтующего объекта Object-C.

Вместо willSet вам нужно использовать didSet

 var on: Bool = false { didSet { if self.on != oldValue { setOn(self.on, animated: false) } } } 
  • Строка Swift 2.0 с подстрокойWithRange
  • NSAllowsArbitraryLoads не работает
  • Как создать переход в SKAction?
  • Swift 2 Дополнительный аргумент 'error' в вызове
  • Swift 2 - Неустранимая ошибка при вызове `didDeselectItemAtIndexPath`
  • UITextField для ввода суммы денег
  • фатальная ошибка: не может увеличивать endIndex
  • Нет кнопки «Назад» в Swift 2
  • Изменить метки ярлыков для диаграммы Coreplot
  • Swift 2: коллекция IBOutlet ! утечка памяти
  • Связывание только встроенных фреймворков с другой динамической инфраструктурой не выполняется при сборке и запуске на устройстве
  • Interesting Posts

    Как найти и установить текст в UILabel UITableViewCell в Swift?

    Как установить изображение в выбранной строке ячейки в UITableView

    Пользовательский файл .plist не добавлен в проект ios

    На iOS, где хранится кеш «добавить на главную страницу» и как его очистить?

    Обновленный сайт разработчика Apple не позволит добавлять устройство в специальный профиль Provisioning April 2013

    Высокопроизводительное копирование данных пикселов RGB на экран в iOS

    Завершение изображения Xcode 8

    Определить состояние приложения при одновременном нажатии кнопки home с запуском приложения

    Использование строкового литерала для селекторов Objective-C устарело, вместо этого используйте '#selector'

    Черная тень CATransition

    Как использовать разделитель тысяч в NSString

    Facebook ios sdk authorize открывает два диалога запроса разрешений

    Как обновить корпоративные приложения ios6 в эфире

    Разница между двумя объектами NSDate – результат также NSDate

    Как проверить, видел ли пользователь уведомление о разрешении push-уведомлений раньше в iOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.