It's for compatibility: Once you import your Swift file/code into Objective-C based project.
And use that if you want your property/method to be accessed by Objective-C code or class.
Most of the time it happens when you are sub classing a Swift class of Objective-C base class.
A Swift class or protocol must be marked with the @objc attribute to
be accessible and usable in Objective-C. This attribute tells the
compiler that this piece of Swift code can be accessed from
Objective-C. If your Swift class is a descendant of an Objective-C
class, the compiler automatically adds the @objc attribute for you.
A late answer, but this @objc behavior is changing slightly as of Swift 4 (which came out in Xcode 9, which was generally released 10 days ago).
In Swift 4, some inference cases of @objc are removed. This just means in some additional cases where before the @objc header was inferred by the Swift compiler, it's in Swift 4 not inferred.
Read more at the Swift evolution proposal about this change
As has been mentioned, in general @objc is to expose certain methods to the Objective-C runtime, which is part of Swift's interoperability the language.
Another late answer, but none of the existing answers on this question really answer the OP's question, which is: why the heck would you need to use @objc on a private class member, if @objc is there for interaction with Objective-C, and the member in question is private, meaning that even if you have Objective-C code in your project, it shouldn't be able to see the member anyway?
The reason is that, because many of the frameworks are written in Objective-C, sometimes Objective-C features are needed to interact with certain APIs.
For example, suppose I want to register for a notification via DistributedNotificationCenter:
For this to work, we need to be able to get the selector for the somethingHappened method. However, selectors are an Objective-C concept, so if the method is not visible to Objective-C, it does not have a selector. Therefore, even if the method is private and should not be called by arbitrary outside code, it will need an @objc in order for the DistributedNotification code, which is written in Objective-C, to be able to call it via its selector.
Another common case where @objc is needed is to support Key-Value Coding (KVC), especially on macOS, where KVC and KVO are used to implement Cocoa Bindings. KVC is, like many other systems in Cocoa, implemented in Objective-C, which has the effect of requiring KVC-compliant properties to be exposed to the Objective-C runtime. Sometimes, it makes sense for KVC-compliant properties to be private. One example is when you have a property that affects other properties:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
In this case, our actual stored property is private, but the dependent property, which we do expose to outside code, needs to send its notifications when the private property is updated. By marking the private property as @objc, we can easily do that by setting up a KVC dependency—otherwise, we'd have to write code to manually send the notifications in the private property's willSet and didSet handlers. In addition, the static property that informs the KVC system that dependentProperty is dependent on originalProperty needs to be exposed to Objective-C so that the KVC system and find it and call it, but it's not relevant to clients of our code.
Also, a view controller in a macOS app that updates controls in its view using Cocoa Bindings as an implementation detail may make certain private properties KVC-compliant in order to bind those controls to them.
So as you see, there are times when a method or property may need to be exposed to Objective-C in order to interact with the frameworks, without necessarily needing to be visible to clients of your code.
@objc exposes a declaration to Objective-C runtime[About]. Let's take a look at #selector[About] feature of Swift to use an Objective-C runtime. In this case you are able to define your Swift @objc private func[More]
To use Swift's functions from Objective-C:
Swift's class should be extended from NSObject
Mark Swift's:
a. @objcMembersclass only - to expose allpublicconstructors, fields and methods. Also it is applicable for subclasses
b. @objcclass/enum/protocol (except struct)[Named Type]
@objcclass(optional) - to expose a defaultpublic init(). Or @objc(<custom_name>) to setup a custom name for class.
@objcconstructors, fields and methods - to expose them selectively
Swift's method will be available by the next naming: