Herman Code 🚀

selector in Swift

February 20, 2025

📂 Categories: Swift
selector in Swift

Swift builders perpetually try for cleaner, much maintainable codification. 1 cardinal facet of attaining this entails efficaciously managing Nonsubjective-C runtime interactions, particularly once running with bequest codification oregon definite frameworks. The @selector() directive performs a important function successful this procedure, bridging the spread betwixt Swift’s kind-harmless planet and the dynamic quality of Nonsubjective-C. Knowing its nuances is indispensable for immoderate Swift developer aiming to compose strong and businesslike purposes. This article volition delve into the intricacies of @selector(), exploring its utilization, champion practices, and possible pitfalls.

Knowing the Function of @selector()

@selector() successful Swift permits you to mention to an Nonsubjective-C methodology by its sanction. This is important once running with APIs that anticipate selectors, specified arsenic mark-act patterns, cardinal-worth observing (KVO), and any older frameworks. Basically, a selector acts arsenic a alone identifier for a technique, enabling runtime technique invocation.

Ideate needing to set off a circumstantial act once a fastener is pressed. Utilizing @selector(), you tin specify the methodology to beryllium referred to as once the fastener’s act is triggered. This dynamic dispatch mechanics is a cornerstone of Nonsubjective-C and stays applicable successful Swift once interacting with Nonsubjective-C APIs.

It’s crucial to differentiate @selector() from straight calling a methodology. Piece calling a technique executes it instantly, @selector() merely creates a mention to the methodology, permitting for future execution. This delayed execution is critical for situations similar case dealing with and asynchronous operations.

Utilizing @selector() with Mark-Act

1 of the about communal usage instances for @selector() is successful mark-act patterns. This form, prevalent successful UIKit, permits you to subordinate a circumstantial act (a technique) with a mark (an entity) and an case (e.g., a fastener estate). @selector() specifies the act to beryllium carried out once the case happens.

For case, once mounting ahead a fastener’s act, you’d usage @selector() to bespeak the methodology that ought to beryllium known as once the fastener is tapped. This transportation betwixt the fastener and the technique is established astatine runtime, enabling versatile case dealing with.

See this simplified illustration: fastener.addTarget(same, act: selector(buttonTapped), for: .touchUpInside). Present, selector(buttonTapped) refers to the buttonTapped() methodology, which volition beryllium executed once the fastener is tapped. Line the usage of the selector syntax, which gives compile-clip checking for the technique’s beingness.

@selector() and Cardinal-Worth Observing (KVO)

Cardinal-Worth Observing (KVO) is a mechanics that permits objects to beryllium notified of adjustments to the properties of another objects. @selector() performs a function successful KVO by specifying the perceiver technique to beryllium referred to as once a place modifications.

Piece KVO is little communal successful contemporary Swift owed to options similar place observers, it’s inactive encountered once interacting with older APIs oregon Nonsubjective-C codebases.

Once observing a place utilizing KVO, you supply a selector that identifies the methodology to beryllium invoked once the place’s worth adjustments. This permits your entity to respond dynamically to adjustments successful another objects’ states.

Champion Practices and Possible Pitfalls

Utilizing @selector() efficaciously requires attraction to item. Typos successful the selector sanction tin pb to runtime crashes, arsenic the Nonsubjective-C runtime gained’t beryllium capable to discovery the corresponding technique.

Ever usage the selector syntax launched successful Swift four. This supplies compile-clip checking, catching possible errors aboriginal successful the improvement procedure. Moreover, guarantee that the methodology signature inside the @selector() matches the anticipated signature of the API you’re utilizing.

Overuse of @selector() tin typically bespeak a plan content. See whether or not much contemporary Swift approaches, similar closures oregon place observers, might message a cleaner and much kind-harmless resolution. Nevertheless, knowing @selector() is important for bridging the spread betwixt Swift and Nonsubjective-C, particularly successful blended-communication tasks.

FAQ

Q: What’s the quality betwixt @selector() and calling a methodology straight?

A: @selector() creates a mention to a methodology with out executing it instantly. This is utilized for delayed execution successful patterns similar mark-act and KVO. Calling a technique straight executes it correct distant.

Successful decision, @selector() is a critical implement for Swift builders running with Nonsubjective-C APIs. Knowing its intent, appropriate utilization, and possible pitfalls ensures seamless integration betwixt the 2 languages. By adhering to champion practices and using the selector syntax, you tin leverage the powerfulness of dynamic dispatch piece sustaining codification readability and stableness. Research additional by checking retired Pome’s documentation connected Nonsubjective-C Runtime and experimenting with @selector() successful your ain tasks. See besides speechmaking much astir utilizing Nonsubjective-C and C codification inside Swift tasks for a blanket knowing of interoperability. Eventually, delve deeper into the intricacies of Cardinal-Worth Observing to full grasp its action with selectors.

[Infographic Placeholder]

  • Usage selector for compile-clip condition.
  • Debar overuse; see contemporary Swift options.
  1. Place the mark entity.
  2. Specify the act utilizing selector.
  3. Link the mark, act, and case.

Larn Much Astir Swift ImprovementQuestion & Answer :
I’m attempting to make an NSTimer successful Swift however I’m having any problem.

NSTimer(timeInterval: 1, mark: same, selector: trial(), userInfo: nil, repeats: actual) 

trial() is a relation successful the aforesaid people.


I acquire an mistake successful the application:

Might not discovery an overload for ‘init’ that accepts the provided arguments

Once I alteration selector: trial() to selector: nil the mistake disappears.

I’ve tried:

  • selector: trial()
  • selector: trial
  • selector: Selector(trial())

However thing plant and I tin’t discovery a resolution successful the references.

Swift itself doesn’t usage selectors — respective plan patterns that successful Nonsubjective-C brand usage of selectors activity otherwise successful Swift. (For illustration, usage elective chaining connected protocol varieties oregon is/arsenic checks alternatively of respondsToSelector:, and usage closures wherever you tin alternatively of performSelector: for amended kind/representation condition.)

However location are inactive a figure of crucial ObjC-primarily based APIs that usage selectors, together with timers and the mark/act form. Swift supplies the Selector kind for running with these. (Swift robotically makes use of this successful spot of ObjC’s SEL kind.)

Successful Swift 2.2 (Xcode 7.three) and future (together with Swift three / Xcode eight and Swift four / Xcode 9):

You tin concept a Selector from a Swift relation kind utilizing the #selector look.

fto timer = Timer(timeInterval: 1, mark: entity, selector: #selector(MyClass.trial), userInfo: nil, repeats: mendacious) fastener.addTarget(entity, act: #selector(MyClass.buttonTapped), for: .touchUpInside) position.execute(#selector(UIView.insertSubview(_:aboveSubview:)), with: fastener, with: otherButton) 

The large happening astir this attack? A relation mention is checked by the Swift compiler, truthful you tin usage the #selector look lone with people/technique pairs that really be and are eligible for usage arsenic selectors (seat “Selector availability” beneath). You’re besides escaped to brand your relation mention lone arsenic circumstantial arsenic you demand, arsenic per the Swift 2.2+ guidelines for relation-kind naming.

(This is really an betterment complete ObjC’s @selector() directive, due to the fact that the compiler’s -Wundeclared-selector cheque verifies lone that the named selector exists. The Swift relation mention you walk to #selector checks beingness, rank successful a people, and kind signature.)

Location are a mates of other caveats for the relation references you walk to the #selector look:

  • Aggregate features with the aforesaid basal sanction tin beryllium differentiated by their parameter labels utilizing the aforementioned syntax for relation references (e.g. insertSubview(_:astatine:) vs insertSubview(_:aboveSubview:)). However if a relation has nary parameters, the lone manner to disambiguate it is to usage an arsenic formed with the relation’s kind signature (e.g. foo arsenic () -> () vs foo(_:)).
  • Location’s a particular syntax for place getter/setter pairs successful Swift three.zero+. For illustration, fixed a var foo: Int, you tin usage #selector(getter: MyClass.foo) oregon #selector(setter: MyClass.foo).

Broad notes:

Instances wherever #selector doesn’t activity, and naming: Typically you don’t person a relation mention to brand a selector with (for illustration, with strategies dynamically registered successful the ObjC runtime). Successful that lawsuit, you tin concept a Selector from a drawstring: e.g. Selector("dynamicMethod:") — although you suffer the compiler’s validity checking. Once you bash that, you demand to travel ObjC naming guidelines, together with colons (:) for all parameter.

Selector availability: The methodology referenced by the selector essential beryllium uncovered to the ObjC runtime. Successful Swift four, all technique uncovered to ObjC essential person its declaration prefaced with the @objc property. (Successful former variations you received that property for escaped successful any circumstances, however present you person to explicitly state it.)

Retrieve that backstage symbols aren’t uncovered to the runtime, excessively — your technique wants to person astatine slightest inner visibility.

Cardinal paths: These are associated to however not rather the aforesaid arsenic selectors. Location’s a particular syntax for these successful Swift three, excessively: e.g. chris.valueForKeyPath(#keyPath(Individual.mates.firstName)). Seat SE-0062 for particulars. And equal much KeyPath material successful Swift four, truthful brand certain you’re utilizing the correct KeyPath-primarily based API alternatively of selectors if due.

You tin publication much astir selectors nether Interacting with Nonsubjective-C APIs successful Utilizing Swift with Cocoa and Nonsubjective-C.

Line: Earlier Swift 2.2, Selector conformed to StringLiteralConvertible, truthful you mightiness discovery aged codification wherever naked strings are handed to APIs that return selectors. You’ll privation to tally “Person to Actual Swift Syntax” successful Xcode to acquire these utilizing #selector.