The protocol to which all classes implicitly conform.
- Xcode 9.0+
- Swift Standard Library
Any when you need the flexibility of an untyped object or when you use bridged Objective-C methods and properties that return an untyped result.
Any can be used as the concrete type for an instance of any class, class type, or class-only protocol. For example:
Any can also be used as the concrete type for an instance of a type that bridges to an Objective-C class. Many value types in Swift bridge to Objective-C counterparts, like
The flexible behavior of the
Any protocol is similar to Objective-C’s
id type. For this reason, imported Objective-C types frequently use
Any as the type for properties, method parameters, and return values.
Casting AnyObject Instances to a Known Type
Objects with a concrete type of
Any maintain a specific dynamic type and can be cast to that type using one of the type-cast operators (
This example uses the conditional downcast operator (
as?) to conditionally cast the
s constant declared above to an instance of Swift’s
If you have prior knowledge that an
Any instance has a particular type, you can use the unconditional downcast operator (
as!). Performing an invalid cast triggers a runtime error.
Casting is always safe in the context of a
Accessing Objective-C Methods and Properties
When you use
Any as a concrete type, you have at your disposal every
@objc method and property—that is, methods and properties imported from Objective-C or marked with the
@objc attribute. Because Swift can’t guarantee at compile time that these methods and properties are actually available on an
Any instance’s underlying type, these
@objc symbols are available as implicitly unwrapped optional methods and properties, respectively.
This example defines an
Integer type with an
@objc method named
In the example,
obj has a static type of
Any and a dynamic type of
Integer. You can use optional chaining to call the
obj safely. If you’re sure of the dynamic type of
obj, you can call
If the dynamic type of
obj doesn’t implement a
get method, the system returns a runtime error when you initialize
Alternatively, if you need to test whether
obj exists, use optional binding before calling the method.