2015-08-15 2 views
1

Я пытаюсь подкласса NSColorPicker и принять протокол NSColorPickingCustom.Метод протокола Swift конфликтует с свойством суперкласса

NSColorPicker имеет некоторые простые вычисляемые свойства, такие как

var buttonToolTip: String { get } 

Но NSColorPickingCustom требует методов с тем же именем, как и

func buttonToolTip() -> String 

Если я реализовать метод buttonToolTop, он конфликтует с суперкласса геттер с то же имя. Если я переопределяю вычисленное свойство, я не согласуюсь с протоколом. Если я попытаюсь использовать как, тогда, конечно, они конфликтуют друг с другом.

Есть ли способ для класса принять этот протокол при подклассификации NSColorPicker?

+0

Зачем вам нужно делать оба? Не было бы * либо * подклассификации или реализации протокола достаточно? –

+0

NSColorPicker уже обеспечивает соответствие NSColorPickingDefault для вас (где, как представляется, существует требование 'buttonToolTip()'). Переопределение только вычисленного свойства кажется прекрасным. – jtbandes

+0

@jtbandes точно прав. 'var buttonToolTip' имеет getter; что getter _is_ является эквивалентом 'func buttonToolTip()', который ищет NSColorPickingCustom. – matt

ответ

1

NSColorPicker уже обеспечивает соответствие NSColorPickingDefault (для чего требуется buttonToolTip() требование). Превышение только вычисленного имущества, похоже, работает нормально:

import Cocoa 

class C: NSColorPicker, NSColorPickingCustom 
{ 
    override var buttonToolTip: String { return "test" } 

    // NSColorPickingCustom 
    func supportsMode(mode: NSColorPanelMode) -> Bool { return false } 
    func currentMode() -> NSColorPanelMode { return .NSNoModeColorPanel } 
    func provideNewView(initialRequest: Bool) -> NSView { return NSView() } 
    func setColor(newColor: NSColor) { } 
} 

let c = C() 
c.buttonToolTip // returns "test" 

let d: NSColorPickingDefault = C() 
d.buttonToolTip() // returns "test" 
+0

Не просто «кажется». Это _nature_ вычисленной переменной. Его получатель _is_ является одноименной функцией (в отношении Objective-C). Swift не видит этого, потому что явный getter автоматически подавляется; но Objective-C видит это так. Свойство только для чтения, для Objective-C, является просто сокращением существования геттера. – matt

+0

Правильно, * относительно Objective-C *. В Swift, конечно, синтаксис отличается для функций и вычисляемых свойств, но '@property NSString * buttonToolTip;' подразумевает '- (NSString *) buttonToolTip'. – jtbandes

+0

И факт, что 'func buttonToolTip()' появляется вообще, - это просто странность моста Obj-C до Swift. @TomHarrington, я бы порекомендовал [подачу ошибку] ​​(https://bugreport.apple.com). – jtbandes

Смежные вопросы