There are differences, but they can be a bit nuanced. In a nutshell, @objc gives you optional which you shouldn't need and doesn't work with structs. NSObjectProtocol on the other hand essentially just constrains implementations to be subclasses of NSObject .

Annotating a protocol as @objc means it is registered with the Objective-C runtime, allowing the protocol to have runtime specific features, namely optional requirements. It also means that the protocol cannot be used on a struct but it could be used on any class and likewise dictionaries and arrays holding it can be bridged to NSDictionary and NSArray. From a pure-swift perspective, there's probably no reason you would need to do, since that feature has largely been supplanted with protocol extensions.