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) } } } 
  • Имя UIImage из массива сохраняет значение nil.
  • Swift iOS 9 Ошибка NSURLErrorDomain -1004
  • Swift - NSTimer передает неправильное значение для параметра userInfo
  • подслой с не конечным положением
  • читать комментарий или комментировать узел из xml в swift
  • Xcode 7 beta 5 Swift 2 избыточное соответствие протокольной ошибке
  • Текст UITextField перескакивает iOS 9
  • Как обнаружить все касания в Swift 2
  • swift2 AVAudioRecorder
  • Пример OBD2Kit Swift не может привести к типу, продолжать получать нуль
  • Сделать символическую точку останова в UICollectionViewFlowLayoutBreakForInvalidSizes
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.