Swift с использованием NSStatusBar statusItemWithLength и NSVariableStatusItemLength
Я пытаюсь переписать следующий код из Темы программирования строки состояния в Swift.
NSStatusBar *bar = [NSStatusBar systemStatusBar];
theItem = [bar statusItemWithLength:NSVariableStatusItemLength];
[theItem retain];
[theItem setTitle: NSLocalizedString(@"Tablet",@"")];
...
Мой код Swift:
let bar = NSStatusBar.systemStatusBar()
let sm = bar.statusItemWithLength(NSVariableStatusItemLength)
sm.title = "Tablet"
...
Проблема заключается в том, что метод statusItemWithLength
в Swift исключает CGFloat
, но NSVariableStatusItemLength
определяется как CInt
в Swift. Я вижу следующую ошибку:
'CInt' is not convertible to 'CGFloat'
Определение в Xcode:
var NSVariableStatusItemLength: CInt { get }
var NSSquareStatusItemLength: CInt { get }
class NSStatusBar : NSObject {
class func systemStatusBar() -> NSStatusBar!
func statusItemWithLength(length: CGFloat) -> NSStatusItem!
...
}
Я что-то делаю неправильно? Как я могу это исправить?
Ответы
Ответ 1
Для бета-версии 1 и 2 вы можете вручную преобразовать NSVariableStatusItemLength из CInt в требуемый CGFloat, например:
let sm = bar.statusItemWithLength( CGFloat(NSVariableStatusItemLength) )
В Beta 3 NSVariableStatusItemLength теперь является CGFloat, но из-за ошибки компоновщика (ошибка) вы должны использовать
-1 вместо NSVariableStatusItemLength и
-2 вместо NSSquareStatusItemLength
let sm = bar.statusItemWithLength( -1 )
Благодаря suzhi и gui_dos для выяснения этого!
Ответ 2
В качестве обходного пути с выпуском Beta 3 вы можете напрямую передать Int константу. Например:
statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1) // NSVariableStatusItemLength
https://github.com/gui-dos/Guigna/blob/181f9db1056dece888dc29424cc2da79f8f284e3/Guigna-Swift/Guigna/GuignaAppDelegate.swift#L138