繁体   English   中英

Swift 2,使用Objective-C选择器'setOn:'的方法'setOn'与使用相同Objective-C选择器的'on'的setter冲突

[英]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

我认为willSetdidSet不是解决方案,因为即使添加一些保护条件, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM