我想为Swift中的所有highlightable视图创建一个共同的祖先。我想是实现highlighted
财产已有UIKit类工作开箱即用,所以阅读this answer和检查the Objective-C getter is defined as isHighlighted
后,我改变了协议定义的:使用Objective-C属性获取器实现Swift协议
@objc protocol Highlightable {
var highlighted: Bool { @objc(isHighlighted) get set }
}
所以对于UILabel
和UIControl
协议实现是这样简单:
extension UILabel: Highlightable {}
extension UIControl: Highlightable {}
这个伟大的工程,我可以访问和设置雨燕highlighted
财产Highlightable
实例。然而,当我试图实现协议上我的雨燕班,也不像这个最简单的实现:
class HighlightableView: UIView, Highlightable {
var highlighted: Bool = false
}
我得到这个编译错误:
Objective-C method 'highlighted' provided by getter for 'highlighted' does not match the requirement's selector ('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
}
你有测试了第一个样本?我无法得到它编译 – redent84
@ redent84是的。它编译罚款(Xcode 8.2)。你能分享这个错误吗? –
它不适用于XCode 8.0,但它在XCode 8.2上工作。 – redent84