Skip to main content
A Swift String is a value type (struct) that represents a collection of Unicode characters. Under the hood, it is implemented as a dynamically sized, Unicode-correct collection of UTF-8 code units.

Memory Management and Semantics

Strings in Swift enforce value semantics. When a string is assigned to a new variable or passed to a function, it is logically copied. However, Swift optimizes this using Copy-on-Write (CoW). The underlying memory buffer is shared across multiple instances and is only duplicated when a mutation occurs.

Unicode and Extended Grapheme Clusters

Swift strings are fully Unicode-compliant. A String is a collection of Character types, where each Character represents a single extended grapheme cluster. A grapheme cluster is a sequence of one or more Unicode scalars that render as a single human-readable symbol.

Indexing

Because extended grapheme clusters require variable amounts of memory, Swift strings cannot be accessed via constant-time integer subscripting (e.g., str[2]). Instead, traversal and element access require String.Index, which calculates the byte offsets of the UTF-8 code units.

Substrings

Slicing a String returns a Substring type. A Substring shares the exact same memory buffer as the original String to prevent unnecessary memory allocation. To persist a substring beyond the lifecycle of the original string, it must be explicitly converted back into a new String instance.

Syntax and Literals

Swift provides multiple literal formats to handle different string parsing requirements at compile time. Standard and Multiline Literals:
String Interpolation: Expressions can be evaluated directly within a string literal using the \() syntax. Under the hood, this utilizes the ExpressibleByStringInterpolation protocol.
Raw String Literals: Wrapping a string in number signs (#) disables standard escape sequences, treating backslashes and quotes as literal characters.

Objective-C Bridging

On Apple platforms, Swift’s String is seamlessly bridged to Foundation’s NSString. This allows String to be passed into Objective-C APIs expecting NSString without explicit casting. However, it is important to note that while Swift String natively uses UTF-8, NSString operates on UTF-16 code units, meaning index calculations and character counts may differ between the two types when handling complex Unicode.
Tired of Poor Swift Skills? Fix That With Deep Grasping!Learn More