In attempting to create a Launch Helper as per the Apple docs (and tutorial-ized), I seem to be hitting a hiccup caused by porting the Objective-C code into Swift... who's compiler couldn't be any more redundant in this case.
import ServiceManagement
let launchDaemon: CFStringRef = "com.example.ApplicationLauncher"
if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here
{
// ...
}
The error seems to consistently be:
Type 'Boolean' does not conform to protocol 'BooleanType'
I have tried casting to Bool in a number of locations, in case I'm simply dealing with a redundant, archaic primitive (either brought in by Obj-C or Core Foundation), to no avail.
Just in case, I have tried casting the response:
SMLoginItemSetEnabled(launchDaemon, true) as Bool
which yields the error:
'Boolean' is not convertible to 'Bool'
...seriously?
Boolean is a "historic Mac type" and declared as
typealias Boolean = UInt8
so this compiles:
if SMLoginItemSetEnabled(launchDaemon, Boolean(1)) != 0 { ... }
With the following extension methods for the Boolean type
(and I am not sure if this has been posted before, I cannot find it right now):
extension Boolean : BooleanLiteralConvertible {
public init(booleanLiteral value: Bool) {
self = value ? 1 : 0
}
}
extension Boolean : BooleanType {
public var boolValue : Bool {
return self != 0
}
}
you can just write
if SMLoginItemSetEnabled(launchDaemon, true) { ... }
BooleanLiteralConvertible extension allows the automatic conversion of
the second argument true to Boolean.BooleanType extension allows the automatic conversion of the Boolean
return value of the function to Bool for the if-statement.Update: As of Swift 2 / Xcode 7 beta 5, the "historic Mac type" Boolean
is mapped to Swift as Bool, which makes the above extension methods
obsolete.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With