LS.Shanghai LS.Shanghai - 5 months ago 19
Swift Question

How can this AnyObject? has boolValue property

I have written an NSURL extension in Swift.

extension NSURL {
var isDir : Bool {
do {
var isDir : AnyObject?
try self.getResourceValue(&isDir, forKey: NSURLIsDirectoryKey)
if let result = isDir?.boolValue {
return result
} else {
return false
}
} catch {
return false
}
}
}


That works. But I find some people "cast" the pointer (
isDIR
in this case) to
NSNumber
first. Examples are:



I've found no documentation says
AnyObject
conforms to the
BooleanType
protocol. So how does my code in Swift work?

Answer

Command-click on AnyObject and you will find the answer:

/// The protocol to which all classes implicitly conform.
///
/// When used as a concrete type, all known `@objc` methods and
/// properties are available, as implicitly-unwrapped-optional methods
/// and properties respectively, on each instance of `AnyObject`.  For
/// example:
///
///     class C {
///       @objc func getCValue() -> Int { return 42 }
///     }
///
///     // If x has a method @objc getValue()->Int, call it and
///     // return the result.  Otherwise, return nil.
///     func getCValue1(x: AnyObject) -> Int? {
///       if let f: ()->Int = x.getCValue { // <===
///         return f()
///       }
///       return nil
///     }
///
///     // A more idiomatic implementation using "optional chaining"
///     func getCValue2(x: AnyObject) -> Int? {
///       return x.getCValue?() // <===
///     }
///
///     // An implementation that assumes the required method is present
///     func getCValue3(x: AnyObject) -> Int { // <===
///       return x.getCValue() // x.getCValue is implicitly unwrapped. // <===
///     }
///
/// - SeeAlso: `AnyClass`
@objc public protocol AnyObject {
}

So, you can call any @objc method on an AnyObject instance.

If you type

let a: AnyObject?

in a Playground and then:

a?.

autocomplete will show you the complete list of methods you can call. And it is huge.