Swift 2,我有一个继承自 objc 的 UIView 的类,它有“on”变量,以及相关的方法“setOn:animated”和“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)
}
我收到一条错误消息:带有 Objective-C 选择器“setOn:”的方法“setOn”与具有相同 Objective-C 选择器的“on”的 setter 冲突
我认为 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 ...
}
最佳答案
类似于Compiler error: Method with Objective-C selector conflicts with previous declaration with the same Objective-C selector ,您还可以隐藏属性
带有 @nonobjc
的 Objective-C 运行时:
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)
}
}
这可以防止自动生成冲突的 Objective-C setter。
关于ios - Swift 2,带有 Objective-C 选择器 'setOn' 的方法 'setOn:' 与具有相同 Objective-C 选择器的 'on' 的 setter 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703495/