Protocol declared in Objective-C Framework is not visible in Swift

Viewed 790

As the title says I have trouble using a protocol declared in Objective-C framework in a Swift app. I will try to describe the situation in detail below.

I have a framework that has mixed Objective-C and Swift code.

This is similar to what I have in the file with protocol definition.

// MyLibrary.h

@protocol MyDelegate <NSObject>;

@interface ClassThatUsesMyDelegate
@property (weak, nonatomic, nullable) id<MyDelegate>delegate;
@end

@protocol MyDelegate
- (void)aMethod;
@end

Objective-C code is wrapped in a module as such:

// module.modulemap

module MyObjCLibrary {
    header "MyLibrary.h"
    export *
}

Then I have Swift code that uses the Objective-C code via import MyObjCLibrary where all of the declared above in MyLibrary.h is visible and usable.

The umbrella header of the framework has #import "MyLibrary.h". Which should expose all the code from MyLibrary.h to anyone who uses my framework.

Here is where the problem starts. When I embed this framework in my test app I can use any Swift code from my library as well as ClassThatUsesMyDelegate from MyLibrary.h. Howerver, when I try to use the protocol MyDelegate I get a compiler error that this type has not been declared. Example of usage below:

// MyViewController.swift

import UIKit
import MyFramework

class MyViewController: UIViewController {
    ...
}

extension MyViewController: MyDelegate { // Error: Use of undeclared type 'MyDelegate'
    func aMethod() {
        ...
    }
}

EDIT: This seems to be the case only with protocols, everything else like varibles, classes, enums etc are accessible.

0 Answers
Related