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

后端 未结 2 569
既然无缘
既然无缘 2020-12-07 01:39

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

相关标签:
2条回答
  • 2020-12-07 01:42

    Right, I had a similar issue trying to get the BOOL return of an objective-C method in Swift.

    Obj-C:

    - (BOOL)isLogging
    {
        return isLogging;
    }
    

    Swift:

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

    this was the way that I got rid of the error.

    0 讨论(0)
  • 2020-12-07 01:51

    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) { ... }
    
    • The BooleanLiteralConvertible extension allows the automatic conversion of the second argument true to Boolean.
    • The 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.

    0 讨论(0)
提交回复
热议问题