I have a mixed Swift Obj-C framework. Inside framework target there is a modulemap file with next contents:
framework module ObjCSwiftMix {
umbrella "."
export *
}
I also have couple of files:
- A) Obj-C protocol
- B) Obj-C class
- C) Swift class, that uses Obj-C protocol
- D) Swift class, that uses Obj-C class
- E) Swift class
In framework target settings:
MODULEMAP_FILE
is set to point to that file, BUILD_LIBRARY_FOR_DISTRIBUTION = YES
, DEFINES_MODULE = YES
.
Inside Unit Tests Target - mocks of swift classes, all Obj-C compatible.
So the problem is, that the only interface in Generated Header file (*Tests-Swift.h
file) is swift class, that uses Obj-C protocol (C in list). Interface for D and E is not generated.
Code of mocks:
import Foundation
@testable import ObjCSwiftMix
// No Obj-C Interface in ObjCSwiftMixTests-Swift.h
@objcMembers
@objc
public final class VersionProviderSpy: VersionProvider {
public var returnedVersion: Double! = 42
public var valudue: Any!
public override func version() -> Double {
returnedVersion
}
}
@testable import ObjCSwiftMix
// No Obj-C Interface in ObjCSwiftMixTests-Swift.h
@objc(OSMAssetsReportParametersProviderSpy)
@objcMembers
public class AssetsReportParametersProviderSpy: AssetsReportParametersProvider {
public var passedAssetAdapters: [String: OSMNativeAssetBindingAdapter] = [:]
public var returnedAssetsReportParameters: [String: [String: Any]] = [:]
public var assetsReportParametersCalled = false
public init() {
super.init(assetViews: [:], providedAssets: [])
}
public override func assetsReportParameters(
assetAdapters: [String: OSMNativeAssetBindingAdapter]
) -> [String: [String: Any]] {
passedAssetAdapters = assetAdapters
assetsReportParametersCalled = true
return returnedAssetsReportParameters
}
}
But for that one interface is generated:
import UIKit
@testable import ObjCSwiftMix
// Ok Obj-C interface is generated
@objcMembers
final class VideoViewProviderSpy: NSObject, OSMAVideoViewProvider {
var invokedGetView = false
var invokedGetViewCount = 0
var stubbedGetViewResult: UIView?
func getView() -> UIView? {
invokedGetView = true
invokedGetViewCount += 1
return stubbedGetViewResult
}
}
For better understanding, a have made a sample project ObjCSwiftMix
. To reproduce the error build ObjCSwiftMixTest
scheme.