简体   繁体   中英

Bridging Swift Initialisers to Objective C

I'm attempting to slowly migrate an Objective C app over to Swift and have started to create new classes -

public class MapsAPI : NSObject {

    let delegate: MapsAPIResponseDelegate

    public init(managerWithDelegate delegate: MapsAPIResponseDelegate) {
        self.delegate = delegate
    }

}

Now in my Objective C .m file I've declared #import MyTarget-Swift.h and in my .h I've added @class MapsAPI which all seems fine however I'm not sure what the Objective C initialisation code should look like. I've tried -

MapsAPI *api = [[MapsAPI alloc] initWithManagerWithDelegate: self];

But that errors with -

No visible @interface for 'MapsAPI' declares the selector 'initWithManagerWithDelegate:'

I've tried looking at the definition of my MyTarget-Swift.h but all that shows is -

SWIFT_CLASS("_TtC4What7MapsAPI")
@interface MapsAPI : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
@end

Is there something I'm doing wrong here?

You may choose to add @objcMembers to your class declaration:

public class @objcMembers MapsAPI : NSObject {

    let delegate: MapsAPIResponseDelegate

    public init(managerWithDelegate delegate: MapsAPIResponseDelegate) {
        self.delegate = delegate
    }
}

Alternatively (or additionally... who am I to judge) you can mark your initializer as being exposed to Objective-C

public class MapsAPI : NSObject {

    let delegate: MapsAPIResponseDelegate

    @objc public init(managerWithDelegate delegate: MapsAPIResponseDelegate) {
        self.delegate = delegate
    }
}

And if you want to, you can also explicitly define the Objective-C selector used:

public class MapsAPI : NSObject {

    let delegate: MapsAPIResponseDelegate

    @objc(initManagerWithDelegate:)
    public init(managerWithDelegate delegate: MapsAPIResponseDelegate) {
        self.delegate = delegate
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM