gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:07 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com