<!--
{
  "documentType" : "article",
  "framework" : "Swift",
  "identifier" : "/documentation/Swift/handling-dynamically-typed-methods-and-objects-in-swift",
  "metadataVersion" : "0.1.0",
  "role" : "article",
  "title" : "Handling Dynamically Typed Methods and Objects in Swift"
}
-->

# Handling Dynamically Typed Methods and Objects in Swift

Cast instances of the Objective-C `id` type to a specific Swift type.

## Overview

In Objective-C, the `id` type represents objects that are instances of any Objective-C
class. The `id` type is instead imported by Swift as the `Any` type. When you pass
a Swift instance to an Objective-C API, it’s bridged as an `id` parameter so that
it’s usable in the API as an Objective-C object. When `id` values are imported into
Swift as `Any`, the runtime automatically handles bridging back to either class references
or value types.

```swift
var x: Any = "hello" as String
x as? String   // String with value "hello"
x as? NSString // NSString with value "hello"

x = "goodbye" as NSString
x as? String   // String with value "goodbye"
x as? NSString // NSString with value "goodbye"
```

### Downcast Objects to Call Methods and Access Properties

When you work with objects of type `Any` where you know the underlying type, it’s
often useful to downcast those objects to the underlying type. However, because the
`Any` type can refer to any type, a downcast to a more specific type isn’t guaranteed
by the compiler to succeed.

You can use the conditional type cast operator (`as?`), which returns an optional
value of the type you are trying to downcast to:

```swift
let userDefaults = UserDefaults.standard
let lastRefreshDate = userDefaults.object(forKey: "LastRefreshDate") // lastRefreshDate is of type Any?
if let date = lastRefreshDate as? Date {
    print("\(date.timeIntervalSinceReferenceDate)")
}
```

If you’re completely certain about the type of the object, you can use the forced
downcast operator (`as!`) instead.

```swift
let myDate = lastRefreshDate as! Date
let timeInterval = myDate.timeIntervalSinceReferenceDate
```

However, if a forced downcast fails, a runtime error is triggered:

```swift
let myDate = lastRefreshDate as! String // Error
```

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)