Sitemap

Swift’s `Escape` Identifiers

3 min readNov 5, 2024

--

The Backtick Superpower You Didn’t Know About

Photo by Christopher Gower on Unsplash

Ever tried naming a Swift variable class or default and got smacked with a compiler error? Yeah, we've all been there. But here's a cool Swift feature that most developers don't know about: you can actually use those forbidden keywords with a simple backtick (`). Let me show you why this is actually pretty useful.

The Backtick Magic

Here’s the deal — wrap any Swift keyword in backticks, and boom, you can use it as a variable name:

let `class` = "iOS Development"
let `default` = true
let `self` = "myself"

// All totally valid Swift code!

When You’ll Actually Use This

1. Dealing with Backend APIs That Hate You

Ever gotten JSON that looks like this?

{
"class": "premium",
"default": true,
"self": "https://api.example.com/user"
}

Instead of cursing at your backend devs, you can just do this:

struct UserSubscription: Decodable {
let `class`: String
let `default`: Bool
let `self`: String

// No need for custom CodingKeys!
}

2. Making Enums That Actually Make Sense

Need an enum with a default case? No problem:

enum Theme {
case light
case dark
case `default` // System setting

var backgroundColor: UIColor {
switch self {
case .light: return .white
case .dark: return .black
case .default: return .systemBackground
}
}
}

// Looks clean in use too
let theme = Theme.default

3. Network Stuff That Just Works

enum RequestType {
case get
case post
case `default` // For when you need a fallback

var httpMethod: String {
switch self {
case .get: return "GET"
case .post: return "POST"
case .default: return "GET"
}
}
}

4. Protocol Requirements That Match Reality

Got an API that uses Swift keywords? No sweat:

protocol UserProfile {
var `self`: URL { get } // Profile URL
var `class`: String { get } // User tier
var `default`: Bool { get } // Is default profile?
}

struct Profile: UserProfile {
let `self` = URL(string: "https://example.com/me")!
let `class` = "premium"
let `default` = true
}

When to Use (and When Not to)

✅ Perfect for:

  • Handling annoying API responses
  • Creating meaningful enum cases
  • Matching external system names
  • Protocol conformance with existing systems

❌ Skip it when:

  • Regular variable naming will do
  • You’re trying to be too clever
  • There’s a better, keyword-free name available

Real-World Examples That Actually Make Sense

1. App Settings with Defaults

enum DisplayMode {
case light
case dark
case `default` // System setting

var description: String {
switch self {
case .light: return "Light Mode"
case .dark: return "Dark Mode"
case .default: return "System Default"
}
}
}

// Usage is clean and obvious
let mode = DisplayMode.default
print(mode.description) // "System Default"

2. API Response Handling

struct APIResponse {
enum Status {
case success
case error
case `default` // For unknown states
}

let status: Status
let `class`: String // API sends membership class
let `self`: URL // API sends self-referential URL
}

// Using it
let response = APIResponse(
status: .default,
class: "premium",
self: URL(string: "https://api.example.com/user")!
)

3. Network Protocol Stuff

enum SecurityProtocol {
case tls
case ssl
case `default` // System recommended

var `protocol`: String { // Yes, you can use it in computed properties too!
switch self {
case .tls: return "TLS 1.3"
case .ssl: return "SSL 3.0"
case .default: return "System Default"
}
}
}

The Bottom Line

Escape identifiers in Swift are like having a “break glass in case of emergency” option for naming things. They’re super handy when:

  • You’re dealing with systems that use Swift keywords
  • You need enum cases that make semantic sense
  • You’re matching external API names
  • Regular naming would be more confusing

Just remember: with great power comes great responsibility. Use escape identifiers when they make your code clearer, not just because you can put backticks around words.

Quick Tips

  1. IDE support works normally — you get full autocomplete
  2. No performance impact (it’s just for the compiler)
  3. Makes your code easier to maintain when working with external systems
  4. Perfect for those “I really need to use this keyword” moments

Wrapping Up

Escape identifiers might seem like a small feature, but they’re a lifesaver when you need them. They let you write cleaner code when dealing with external systems and create more intuitive APIs. Just use them wisely, and your future self (and your team) will thank you.

--

--

No responses yet