This is explained in Apple 's official documentation on Objective-C - Swift compatibility:
When you use the @objc (name) attribute in a Swift class, the class is accessible in Objective-C without any namespace. As a result, this attribute can also be useful when migrating the archived Objective-C class to Swift. Since archived objects store the name of their class in the archive, you must use the @objc (name) attribute to specify the same name as your Objective-C class so that archives can be unpacked by your new Swift class.
Conversely, Swift also provides the @nonobjc attribute, which makes Swift Declaration unavailable in Objective-C. You can use it to allow roundness for bridge methods and allow overloading of methods for classes imported using Objective-C. If the Objective-C method is overridden by the Swift method, which cannot be represented in Objective-C, for example, specifying the parameter as a variable, the method should be marked as @nonobjc.
To summarize, use @objc if you want to set the Swift attribute without a namespace before Objective-C. User @nonobjc, if you want to keep the attribute available and available only for Swift code.
source share