A view of a string’s contents as a collection of UTF-16 code units.
SDK
- Xcode 6.0.1+
Framework
- Swift Standard Library
Declaration
@frozen struct UTF16View
Overview
You can access a string’s view of UTF-16 code units by using its utf16
property. A string’s UTF-16 view encodes the string’s Unicode scalar values as 16-bit integers.
let flowers = "Flowers 💐"
for v in flowers.utf16 {
print(v)
}
// 70
// 108
// 111
// 119
// 101
// 114
// 115
// 32
// 55357
// 56464
Unicode scalar values that make up a string’s contents can be up to 21 bits long. The longer scalar values may need two UInt16
values for storage. Those “pairs” of code units are called surrogate pairs.
let flowermoji = "💐"
for v in flowermoji.unicodeScalars {
print(v, v.value)
}
// 💐 128144
for v in flowermoji.utf16 {
print(v)
}
// 55357
// 56464
To convert a String
instance back into a string, use the String
type’s init(_:)
initializer.
let favemoji = "My favorite emoji is 🎉"
if let i = favemoji.utf16.firstIndex(where: { $0 >= 128 }) {
let asciiPrefix = String(favemoji.utf16[..<i])
print(asciiPrefix)
}
// Prints "My favorite emoji is "
UTF16View Elements Match NSString Characters
The UTF-16 code units of a string’s utf16
view match the elements accessed through indexed NSString
APIs.
print(flowers.utf16.count)
// Prints "10"
let nsflowers = flowers as NSString
print(nsflowers.length)
// Prints "10"
Unlike NSString
, however, String
does not use integer indices. If you need to access a specific position in a UTF-16 view, use Swift’s index manipulation methods. The following example accesses the fourth code unit in both the flowers
and nsflowers
strings:
print(nsflowers.character(at: 3))
// Prints "119"
let i = flowers.utf16.index(flowers.utf16.startIndex, offsetBy: 3)
print(flowers.utf16[i])
// Prints "119"
Although the Swift overlay updates many Objective-C methods to return native Swift indices and index ranges, some still return instances of NSRange
. To convert an NSRange
instance to a range of String
, use the Range(_:
initializer, which takes an NSRange
and a string as arguments.
let snowy = "❄️ Let it snow! ☃️"
let nsrange = NSRange(location: 3, length: 12)
if let range = Range(nsrange, in: snowy) {
print(snowy[range])
}
// Prints "Let it snow!"