Is something wrong with this code?
struct ContentView: View {
var body: some View {
Text("Hello, world!")
padding()
}
}
Look closer π§
struct ContentView: View {
var body: some View {
Text("Hello, world!")
padding() //<-- missing the "."
}
}
Typo alert ! π²
The code will compile, but it will crash the app! Why?
Despite the missing qualifier, the code compiles because padding()
gets treated as self.padding()
. During runtime, that leads to an infinitely recursive View => stack overflow π₯
I did not find a technique to detect the mistake of a missing dot when using standard SwiftUI view modifiers other than ...
But for custom view modifiers there is a simple way. We can use the Swift attribute @warn_unqualified_access
to warn us in Xcode :)
According to the Swift documentation:
Apply this attribute to a top-level function, instance method, or class or static method to trigger warnings when that function or method is used without a preceding qualifier, such as a module name, type name, or instance variable or constant. Use this attribute to help discourage ambiguity between functions with the same name that are accessible from the same scope.
To better illustrate the use I am taking Apple's example of a custom modifier that you can use to create blue caption text surrounded by a rounded rectangle:
struct BorderedCaption: ViewModifier {
func body(content: Content) -> some View {
content
.font(.caption2)
.padding(10)
.overlay(
RoundedRectangle(cornerRadius: 15)
.stroke(lineWidth: 1)
)
.foregroundColor(Color.blue)
}
}
extension View {
@warn_unqualified_access //<-- produces a warning in Xcode if called without "."
func borderedCaption() -> some View {
modifier(BorderedCaption())
}
}
By adding @warn_unqualified_access
to the function declaration of the View
extension, Xcode is able to produce a warning whenever the function is called without the dot.
This article is greatly inspired by Federico Zanetello's article which taught me about the existence and usefulness of @warn_unqualified_access
.