1

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.

asevko
  • 46
  • 4

1 Answers1

1

Problem solved with setting IOS_DEPLOYMENT_TARGET=13.0 for test target.

asevko
  • 46
  • 4
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Sep 06 '22 at 19:38