ios - Swift 2,带有 Objective-C 选择器 'setOn' 的方法 'setOn:' 与具有相同 Objective-C 选择器的 'on' 的 setter 冲突

标签 ios objective-c swift2

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 冲突

我认为 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

有没有不改变量名和方法名的解决方案?


解决方法:我的解决方案是添加额外的内部变量并使用计算属性公开它。我不喜欢添加额外的变量,肯定会有更好的解决方案。

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/

相关文章:

ios - 是否有构建 Xcode 4 插件的文档?

iphone - 针对 iphone 4s 和 5/5c/5s 屏幕尺寸进行开发的最佳实践

ios - 我在 xcode 中遇到应用程序崩溃

ios - 使其透明后恢复默认导航栏

ios - IOS swift 中的 3D 立方体过渡

ios - Swift 2 无法使用类型的参数列表调用 'FSEventStreamCreate'

iphone - iOS 5 可以降级吗?

ios - 'JSONEncoder'/'JSONDecoder' 在此上下文中对于类型查找不明确

ios - 如何拖放多个具有相同父节点的 SpriteKit 节点?

ios - 从另一个类更新 textField 的文本