<!--
{
  "availability" : [
    "watchOS: 7.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "ClockKit",
  "identifier" : "/documentation/ClockKit/CLKComplicationDescriptor",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "ClockKit"
    ],
    "preciseIdentifier" : "c:objc(cs)CLKComplicationDescriptor"
  },
  "title" : "CLKComplicationDescriptor"
}
-->

# CLKComplicationDescriptor

A descriptor that defines a complication and the families that it supports.

```
class CLKComplicationDescriptor
```

## Overview

Use complication descriptors to define the different types of complications that your app supports. Each descriptor provides a unique identifier for the complication, and the list of families that the complication supports. ClockKit defines the available families using the [`CLKComplicationFamily`](/documentation/ClockKit/CLKComplicationFamily) enumeration, while your app can define as many identifiers as it needs. Each unique [`identifier`](/documentation/ClockKit/CLKComplication/identifier) within your app represents a separate complication in the complication picker. For example, a weather app may have separate descriptors for `Condition`, `Temperature`, and `Precipitation.`

```swift
// Create the condition descriptor.
let conditionDescriptor = CLKComplicationDescriptor(
    identifier: complicationConditionIdentifier,
    displayName: "Weather Condition",
    supportedFamilies: mySupportedFamilies)

// Create the temperature descriptor.
let temperatureDescriptor = CLKComplicationDescriptor(
    identifier: complicationTemperatureIdentifier,
    displayName: "Temperature",
    supportedFamilies: mySupportedFamilies)

// Create the precipitation descriptor.
let precipitationDescriptor = CLKComplicationDescriptor(
    identifier: complicationPrecipitationIdentifier,
    displayName: "Percipitation",
    supportedFamilies: mySupportedFamilies)
```

You can dynamically create unique identifiers to further customize the complications. For example, if the weather app provides separate complications for all the cities in the user’s favorite city list, it can create a separate descriptor for each city and weather data pair. The app can create unique identifiers by appending the city name and the weather data’s name.

```swift
func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) {
    var descriptors = [CLKComplicationDescriptor]()
    
    for city in myData.favoriteCities {
        
        let conditionIdentifier = complicationConditionIdentifier + ": \(city.id)"
        let temperatureIdentifier = complicationTemperatureIdentifier + ": \(city.id)"
        let perceptionIdentifier = complicationPrecipitationIdentifier + ": \(city.id)"
        
        // Create the descriptors for the city.
        descriptors.append(CLKComplicationDescriptor(
                            identifier: conditionIdentifier,
                            displayName: "\(city.abbreviation) Weather Condition",
                            supportedFamilies: CLKComplicationFamily.allCases,
                            userInfo: [myCityIDKey: city.id,
                                       myTypeIdentifierKey: conditionIdentifier]))

        descriptors.append(CLKComplicationDescriptor(
                            identifier: temperatureIdentifier,
                            displayName: "\(city.abbreviation) Temperature",
                            supportedFamilies: CLKComplicationFamily.allCases,
                            userInfo: [myCityIDKey: city.id,
                                       myTypeIdentifierKey: temperatureIdentifier]))

        descriptors.append(CLKComplicationDescriptor(
                            identifier: perceptionIdentifier,
                            displayName: "\(city.abbreviation) Percipitation",
                            supportedFamilies: CLKComplicationFamily.allCases,
                            userInfo: [myCityIDKey: city.id,
                                       myTypeIdentifierKey: perceptionIdentifier]))
        
    }
    
    // The order of the descriptors array
    // determines the order in the complication picker.
    handler(descriptors)
}
```

When dynamically creating identifiers, consider using the descriptor’s [`userInfo`](/documentation/ClockKit/CLKComplicationDescriptor/userInfo) property to contain any additional information your app needs to create timeline entries for the complication. In the above example, the weather app adds the `myCityIDKey` and `myTypeIdentifierKey` `keys` so that it can access the city and weather data type without parsing the `identifier` string.

## Topics

### Creating descriptors

[`init(identifier:displayName:supportedFamilies:)`](/documentation/ClockKit/CLKComplicationDescriptor/init(identifier:displayName:supportedFamilies:))

Returns a new complication descriptor.

[`init(identifier:displayName:supportedFamilies:userActivity:)`](/documentation/ClockKit/CLKComplicationDescriptor/init(identifier:displayName:supportedFamilies:userActivity:))

Returns a new complication descriptor with an associated user activity.

[`init(identifier:displayName:supportedFamilies:userInfo:)`](/documentation/ClockKit/CLKComplicationDescriptor/init(identifier:displayName:supportedFamilies:userInfo:))

Returns a new complication descriptor with an associated dictionary of user data.

[`-  initWithIdentifier:displayName:supportedFamilies:`](/documentation/ClockKit/CLKComplicationDescriptor/initWithIdentifier:displayName:supportedFamilies:)

Returns a new complication descriptor.

[`-  initWithIdentifier:displayName:supportedFamilies:userActivity:`](/documentation/ClockKit/CLKComplicationDescriptor/initWithIdentifier:displayName:supportedFamilies:userActivity:)

Returns a new complication descriptor with an associated user activity.

[`-  initWithIdentifier:displayName:supportedFamilies:userInfo:`](/documentation/ClockKit/CLKComplicationDescriptor/initWithIdentifier:displayName:supportedFamilies:userInfo:)

Returns a new complication descriptor with an associated user info dictionary.

### Accessing the descriptor’s data

[`identifier`](/documentation/ClockKit/CLKComplicationDescriptor/identifier)

A string that uniquely identifies the descriptor.

[`displayName`](/documentation/ClockKit/CLKComplicationDescriptor/displayName)

A localized string that identifies complications from the descriptor to the user.

[`supportedFamilies`](/documentation/ClockKit/CLKComplicationDescriptor/supportedFamilies-4ckbx)

The families that support this type of complication.

[`supportedFamilies`](/documentation/ClockKit/CLKComplicationDescriptor/supportedFamilies-50ink)

The families that support this type of complication.

[`userActivity`](/documentation/ClockKit/CLKComplicationDescriptor/userActivity)

A user activity object that represents the state of the app at a moment in time.

[`userInfo`](/documentation/ClockKit/CLKComplicationDescriptor/userInfo)

A dictionary of data that your data source can use to generate timeline entries.

## Relationships

### Conforms To

[`Sendable`](/documentation/Swift/Sendable)

[`CVarArg`](/documentation/Swift/CVarArg)

[`CustomStringConvertible`](/documentation/Swift/CustomStringConvertible)

[`CustomDebugStringConvertible`](/documentation/Swift/CustomDebugStringConvertible)

[`NSObjectProtocol`](/documentation/ObjectiveC/NSObjectProtocol)

[`SendableMetatype`](/documentation/Swift/SendableMetatype)

[`Equatable`](/documentation/Swift/Equatable)

[`Hashable`](/documentation/Swift/Hashable)

### Inherits From

[`NSObject-swift.class`](/documentation/ObjectiveC/NSObject-swift.class)

---

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)