realm / realm/SwiftLint

Rule Request: Properly unwrap "implicitly unwrapped optionals"

Open
#3,064 5 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

rule-request
Dominant language
Swift
Stars
19.7k
Forks
2.3k
Avg merge
1d 1h
Merged PRs (30d)
11

Description

New Issue Checklist
New rule request
  1. Why should this rule be added? Share links to existing discussion about what
    the community thinks about this.

Many of Apple's API's export "implicitly unwrapped optionals" instead of plain optionals. Usually because those APIs doesn't yet have null annotations. This is a footgun as Swift will not force you to properly unwrap it, which often cause crashes in production.

One example is EKCalendarItem#title, which exports var title: String! { get set }. It's very easy to just use it directly as event.title instead of doing event.title ?? "" or guard/if.

It would be great to have a rule that forces you to explicitly unwrap "implicitly unwrapped optionals" from imported frameworks. I don't think it should trigger on "implicitly unwrapped optionals" in the same file as that's usually intentional.

Some relevant discussion: https://forums.swift.org/t/disable-objc-bridging-as-implicitly-unwrapped-optionals/21966

  1. Provide several examples of what would and wouldn't trigger violations.

Would trigger:

// event.title is EKCalendarItem#title

foo(event.title)

Wouldn't trigger:

foo(event.title ?? "")
guard let title = event.title else {
	return
}

foo(title)
  1. Should the rule be configurable, if so what parameters should be configurable?

No

  1. Should the rule be opt-in or enabled by default? Why?
    See README.md for guidelines on when to mark a rule as opt-in.

I would make it default as it helps catch a lot of potential crashes in production.


This should really be an opt-in warning in Swift, but it doesn't look like that will happen anytime soon:

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Review README.md's opt-in rules guidance and the issue's examples and linked Swift discussions first. Done means a rule identifies direct use of implicitly unwrapped optionals imported from frameworks while allowing explicit coalescing or guard-based unwrapping, with its default or opt-in status resolved.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.