2014-12-04 22 views
10

Nel tentativo di creare un Launch Helper come per i documenti Apple (e tutorial-ized), sembra che si stia verificando un blocco causato dal porting del codice Objective-C in Swift. .. chi è il compilatore non potrebbe essere più ridondante in questo caso.Il tipo 'booleano' non è conforme al protocollo 'BooleanType'

import ServiceManagement 

let launchDaemon: CFStringRef = "com.example.ApplicationLauncher" 

if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here 
{ 
    // ... 
} 

L'errore sembra essere costantemente:

Type 'Boolean' does not conform to protocol 'BooleanType'

ho cercato di colata a Bool in un certo numero di posizioni, in caso sto semplicemente fare con un redundant, archaic primitive (sia portato da Obj-C o Core Foundation), senza risultato.

Solo nel caso, ho provato gettando la risposta:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

che produce l'errore:

'Boolean' is not convertible to 'Bool'

... sul serio?

+0

caro Chris, puoi aggiungere il mio skype: [email protected] e aiutarmi a implementare SMLoginItemSetEnabled. Sono online adesso. Grazie mille. –

risposta

17

Boolean è un "tipo storico Mac" e dichiarato come

typealias Boolean = UInt8 

quindi questo compila:

if SMLoginItemSetEnabled(launchDaemon, Boolean(1)) != 0 { ... } 

Con i seguenti metodi di estensione per il Boolean tipo (e io sono non sono sicuro che sia stato pubblicato prima, non riesco a trovarlo adesso):

extension Boolean : BooleanLiteralConvertible { 
    public init(booleanLiteral value: Bool) { 
     self = value ? 1 : 0 
    } 
} 
extension Boolean : BooleanType { 
    public var boolValue : Bool { 
     return self != 0 
    } 
} 

si può semplicemente scrivere

if SMLoginItemSetEnabled(launchDaemon, true) { ... } 
  • L'estensione BooleanLiteralConvertible consente la conversione automatica del secondo argomento true a Boolean.
  • L'estensione BooleanType consente la conversione automatica del valore di ritorno della funzione su Bool per l'istruzione if.

Aggiornamento: Come di Swift 2/Xcode 7 beta 5, il "tipo storico Mac" Boolean è mappata a Swift come Bool, che rende i metodi di estensione di cui sopra obsoleto.

+0

Ehi, mi è piaciuto 'Boolean (1)' - rende più comprensibile quello con cui lo chiami. :) –

+1

@NateCook: OK, ripristinato, grazie! –

+0

Avrei potuto giurare di aver provato questa combinazione ... Funziona, però! Grazie! –

0

Giusto, ho avuto un problema simile cercando di ottenere il ritorno BOOL di un metodo C-obiettivo in Swift.

Obj-C:

- (BOOL)isLogging 
{ 
    return isLogging; 
} 

Swift:

if (self.isLogging().boolValue) 
    { 
     ... 
    } 

questo è stato il modo in cui mi sono liberato dell'errore.

Problemi correlati