我想爲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