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.