Swiftのすべてのハイライト可能なビューに対して共通の祖先を作成したいとします。私は、すでに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 {}
、私がアクセスしHighlightable
インスタンスとしてスウィフトからhighlighted
プロパティを設定することができます。私はこのような最も単純な実装で私スウィフトクラスのプロトコルを実装しようとすると、しかし、私はそれが仕事を得ることができ
Objective-C method 'highlighted' provided by getter for 'highlighted' does not match the requirement's selector ('isHighlighted')
唯一の方法:
class HighlightableView: UIView, Highlightable {
var highlighted: Bool = false
}
私はこのコンパイル・エラーが発生します計算されたプロパティを使用していますが、それは私が望むものではありません。
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