[英]Swift - Method '*()' with Objective-C selector '*' conflicts with getter for '*' from superclass 'UIView' with the same Objective-C selector
[英]Swift 2, method 'setOn' with Objective-C selector 'setOn:' conflicts with setter for 'on' with the same Objective-C selector
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)
}
我收到一条错误消息: 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
有没有更改变量名称和方法名称的解决方案?
解决方法:我的解决方案是添加额外的内部变量并使用computed属性公开它。 我不喜欢添加额外的变量,肯定会有更好的解决方案。
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 ...
}
同样在编译器错误:用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)
}
}
这可以防止自动生成冲突的Objective-C setter。
而不是willSet
你需要使用didSet
var on: Bool = false
{
didSet
{
if self.on != oldValue
{
setOn(self.on, animated: false)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.