【发布时间】:2016-12-16 14:11:47
【问题描述】:
我想为 Swift 中的所有高亮视图创建一个共同的祖先。我希望实现highlighted 属性的现有UIKit 类开箱即用,因此在阅读this answer 并检查the Objective-C getter is defined as isHighlighted 后,我将协议定义更改为:
@objc protocol Highlightable {
var highlighted: Bool { @objc(isHighlighted) get set }
}
所以UILabel 和UIControl 的协议实现就这么简单:
extension UILabel: Highlightable {}
extension UIControl: Highlightable {}
这很好用,我可以从 Swift 访问 highlighted 属性并将其设置为 Highlightable 实例。然而,当我尝试在我的 Swift 类上实现协议时,即使是这样最简单的实现:
class HighlightableView: UIView, Highlightable {
var highlighted: Bool = false
}
我得到这个编译错误:
getter 为 'highlighted' 提供的 Objective-C 方法 'highlighted' 与需求的选择器 ('isHighlighted') 不匹配
我可以让它工作的唯一方法是使用计算属性,但这不是我想要的。
class HighlightableView: UIView, Highlightable {
var highlighted: Bool { @objc(isHighlighted) get { return true } set {} }
}
我的环境是 Xcode 8.0 和 Swift 3。更新到 XCode 8.2 并且错误仍然存在。
我目前的解决方法是完全避免 Objective-C 和 Swift 之间的任何命名冲突。但这远非理想:
@objc protocol Highlightable {
var _highlighted: Bool { get set }
}
extension UILabel: Highlightable {
var _highlighted: Bool {
get { return isHighlighted }
set { isHighlighted = newValue }
}
}
extension UIControl: Highlightable {
var _highlighted: Bool {
get { return isHighlighted }
set { isHighlighted = newValue }
}
}
class HighlightableView: UIView, Highlightable {
var _highlighted: Bool = false
}
【问题讨论】:
标签: ios objective-c swift swift3