Dev guideAPI Reference
Dev guideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Decide methods for the Swift SDK

Overview of the decide methods which can be used to return a flag decision for a user in Optimizely Full Stack.

Use the Decide methods to return flag decisions for a user. The flag decision includes flag enabled/disabled status and flag variation.

This page describes the following Decide methods:

Decide

Version

SDK 3.7 and higher

Description

Returns a decision result for a flag key for a user. The decision result is returned in an OptimizelyDecision object and contains all data required to deliver the flag rule.

Decide is a method of the UserContext object. See OptimizelyUserContext for details.

See the OptimizelyDecision for details of the returned decision object.

Parameters

The following table describes parameters for the Decide method:

ParameterTypeDescription
flagKeyStringThe key of the feature flag
options (optional)ArrayArray of OptimizelyDecideOption enums. See following table.

OptimizelyDecideOption

The following example shows how you can set options individually on any Decide method, or as global defaults when you instantiate the Optimizely client. See Initialize SDK.

# set global default decide options when initializing the client
let optimizely = OptimizelyClient(sdkKey: sdkKey, defaultDecideOptions: [.disableDecisionEvent])


# set additional options in a decide call
let user = optimizely.createUserContext(userId: "user123")
let decisions = user.decideAll(options: [.enabledFlagsOnly, .disableDecisionEvent])

The following table shows details for the OptimizelyDecideOption.

OptimizelyDecideOption enumIf set:
OptimizelyDecideOption.disableDecisionEventPrevents the visitor from firing an impression while still being served the variation, which disables displaying results of the Decide method on the Results page.

This setting can be why the Decision Event Dispatched enum is false in the returned OptimizelyDecision object or the DECIDE notification listener payload.
OptimizelyDecideOption.enabledFlagsOnlyReturn decisions for enabled flags only. This is a valid option only for methods that decide multiple flags, like the Decide All method. This option is ignored if it is invalid. When this option is not set, the SDK returns all decisions regardless of whether the flag is enabled or not.
OptimizelyDecideOption.ignoreUserProfileServiceWhen set, the SDK bypasses user profile service (UPS) (both lookup and save) for the decision.

When this option is not set, UPS overrides audience targeting, traffic allocation, and experiment mutual exclusion groups.
OptimizelyDecideOption.includeReasonsReturn log messages in the Reasons field of OptimizelyDecision object. Note that unlike info or debug messages, critical error messages are always returned, regardless of this setting.
OptimizelyDecideOption.excludeVariablesExclude flag variable values from the decision result. Use this option to minimize the returned decision by skipping large JSON variables.

Returns

The Decide method returns an OptimizelyDecision object. For more information, see OptimizelyDecision.

If the method encounters a critical error (SDK not ready, invalid flag key, etc), then it returns a decision with a null Variation Key field and populates the Reasons field with error messages (regardless of the Include Reasons option).

Example decision

The following is an example of calling the Decide method and accessing the returned OptimizelyDecision object:

// create the user and decide which flag rule & variation they bucket into 
let user = optimizelyClient.createUserContext(userId: "user123", attributes: ["logged_in": true])
let decision = user.decide(key: "product_sort")

// Did the decision fail with a critical error?
guard let variationKey = decision.variationKey else {
  print("[decide] error: \(decision.reasons)")
	return
}

// flag enabled state:
let enabled: Bool = decision.enabled

// String variable value:
let value1: String? = decision.variables.getValue(jsonPath: "sort_method")
// or:
let value2: String? = decision.variables.toMap()["sort_method"] as? String

// all variable values
let allVarValues: OptimizelyJSON = decision.variables

// variation. if null, decision fail with a critical error
let variationKey: String = decision.variationKey

// flag decision reasons
let reasons: [String] = decision.reasons

// user for which the decision was made
let userContext: OptimizelyUserContext = decision.userContext

Side effects

Invokes the DECISION notification listener if this listener is enabled.

Decide All

Returns decisions for all active (unarchived) flags for a user.

See OptimizelyDecision for details.

Version

SDK v3.6 and higher

Description

Use the Decide All method to return a map of flag decisions for a user.

Parameters

The following table describes parameters for the Decide All method:

ParameterTypeDescription
options (optional)ArrayArray of OptimizelyDecideOption enums. See OptimizelyDecideOption.

Returns

The Decide All method returns a map of OptimizelyDecisions. For more information, see OptimizelyDecision.

If the method fails for all flags (for example, the SDK isn't ready or the user context is invalid), then it returns an empty map. If the method detects an error for a specific flag, it returns error messages in the Reasons field of the decision for that flag.

Examples

The following is an example of getting flags for the user with the Decide All call:

// make decisions for all active (unarchived) flags in the project for a user
let decisions = user.decideAll()
// or only for enabled flags
let decisions = user.decideAll(options: [.enabledFlagsOnly])

let flagKeys = decisions.keys
let flagDecisions = decisions.values
let decisionForFlag1 = decisions["flag_1"]

Side effects

Invokes the DECISION notification listener for each decision if this listener is enabled.

Decide for specified keys

In the Swift SDK, the Decide method returns a map of flag decisions for specific flag keys if you pass a keys parameter.

Version

SDK v3.6 and higher

Description

Get a map of flag decisions for specific flag keys. Note that in SDKs where the Decide method is not polymorphic and therefore cannot accept a keys parameter, there is instead a Decide For Keys method for the functionality described in this section.

Parameters

The following table describes parameters for the Decide method:

ParameterTypeDescription
keysArrayArray of string flag keys.
options (optional)ArrayArray of OptimizelyDecideOption enums. See OptimizelyDecideOption.

Returns

Returns a map of OptimizelyDecisions. For more information, see OptimizelyDecision.

If the method fails for all flags (for example, the SDK isn't ready or the user context is invalid), then it returns an empty map. If the method detects an error for a specific flag, it returns error messages in the Reasons field of the decision for that flag.

Example

The following is an example of getting specified flags for the user:

// make a decisions for specific enabled  flags
let decisions = user.decide(keys: ["flag_1", "flag_2"], options: [.enabledOnly])

let decisionForFlag1 = decisions["flag_1"]
let decisionForFlag2 = decisions["flag_2"]

Side effects

Invokes the DECISION notification listener for each decision if this listener is enabled.

Source files

The language and platform source files containing the implementation for Swift are available on GitHub.