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