The protocol to which all classes implicitly conform.
SDK
- Xcode 9.0+
Framework
- Swift Standard Library
Declaration
Discussion
You use 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 String
and Int
.
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 (as
, as?
, or as!
).
This example uses the conditional downcast operator (as?
) to conditionally cast the s
constant declared above to an instance of Swift’s String
type.
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 switch
statement.
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 get
.
In the example, obj
has a static type of Any
and a dynamic type of Integer
. You can use optional chaining to call the @objc
method get
on obj
safely. If you’re sure of the dynamic type of obj
, you can call get
directly.
If the dynamic type of obj
doesn’t implement a get
method, the system returns a runtime error when you initialize certain
.
Alternatively, if you need to test whether obj
exists, use optional binding before calling the method.