I can not the idea of compile time and runtime custom attributes enough.
When I was a C# developer I used attributes built into the .NET framework all the time and often wrote my own custom attributes when I needed them for meta programming or plugin style behaviours.
I'm envious of my Android counterparts who get to use libraries like Retrofit for Restful services and frameworks like Dagger for Dependency Injection. All of these empowered by the JVM's support for developer defined attributes and type metadata.
For a custom attribute system to be truely useful however it needs to not just support annotating types, methods and properties but also method parameters and return types.
This is particularly important for tools like Retrofit (where you're mapping parameters to query or URL paths) and dependency injection (for constructor parameter injection).
The mechanism C# used for defining custom attributes is just for the developer to subclass
System.Attribute. While we could define custom Swift syntax for defining attributes (like operators) I'm unsure why you would need to. Attribute parameters in C# are just effectively constructor params.
In C# controlling the applicability of a custom attribute is just defined by adding an attribute to the custom attribute type. Though a selection of built in Attribute subclasses in the stdlib Swift could do the same.