static let sharedInstance无法从Objective C代码访问

时间:2018-02-27 10:18:47

标签: ios objective-c swift mix-and-match

问题:

在构建主应用程序目标时,无法从Objective C代码访问声明的static let sharedInstance。

代码:

    @objc public protocol ManagedObjectContextProvider {
          var context: NSManagedObjectContext { get }
    }

@objc public final class ManagedObjectContextProviderImpl: NSObject, ManagedObjectContextProvider {
    public static let sharedInstance: ManagedObjectContextProvider = ManagedObjectContextProviderImpl()

    override private init() {}

    public var context: NSManagedObjectContext {
        return NSManagedObjectContext.mr_default()
    }
}

上下文

  • 此文件包含在2个目标[主iOS应用和共享扩展]
  • 在swift to objc生成的主应用程序头中,swift类的接口生成如下:

    @class NSManagedObjectContext;
    
    SWIFT_PROTOCOL("_TtP4<#MyAppName#>28ManagedObjectContextProvider_")
    @protocol ManagedObjectContextProvider
    @property (nonatomic, readonly, strong) NSManagedObjectContext * _Nonnull context;
    @end
    
    
    SWIFT_CLASS("_TtC4<#MyAppName>32ManagedObjectContextProviderImpl")
    @interface ManagedObjectContextProviderImpl : NSObject <ManagedObjectContextProvider>
    - (nonnull instancetype)init SWIFT_UNAVAILABLE;
    @property (nonatomic, readonly, strong) NSManagedObjectContext * _Nonnull context;
    @end
    
  • 在swift to objc生成的共享扩展头中,swift类的接口正确生成并且是:

    @class NSManagedObjectContext;
    
    SWIFT_PROTOCOL("_TtP4<MyAppName>28ManagedObjectContextProvider_")
    @protocol ManagedObjectContextProvider
    @property (nonatomic, readonly, strong) NSManagedObjectContext * _Nonnull context;
    @end
    
    
    SWIFT_CLASS("_TtC4<MyAppName>32ManagedObjectContextProviderImpl")
    @interface ManagedObjectContextProviderImpl : NSObject <ManagedObjectContextProvider>
    SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong)       id <ManagedObjectContextProvider> _Nonnull sharedInstance;)
    + (id <ManagedObjectContextProvider> _Nonnull)sharedInstance SWIFT_WARN_UNUSED_RESULT;
    - (nonnull instancetype)init SWIFT_UNAVAILABLE;
    @property (nonatomic, readonly, strong) NSManagedObjectContext * _Nonnull context;
     @end
    
  • 上面指定的MyAppName是生成Swift到Obj C标头时使用的模块名称,对于主目标和共享扩展都是相同的

我尝试了什么: 1.在两个标题中复制相同的类声明[欺骗编译器但在运行时因“无法识别的选择器”而失败] 2.修改扩展的模块名称,使其具有比目标

的diff模块名称

不建议作为解决方案: 1.使用不同的模块而不是属于2个目标的文件

1 个答案:

答案 0 :(得分:2)

要使成员(也EnsureArray<T>(input: T | ReadonlyArray<T> | undefined): ReadonlyArray<T> { if (!input) { return []; } if ((input as any).length !== undefined) { return input as T[]; } return [input as T]; } renderActiveContent() { const items = this.EnsureArray(this.props.children); const tab = items.find(c => c.props.name === this.props.SelectedTab) || items[0]; return tab && tab.props && tab.props.children; } )可以访问ObjC代码,您需要向其添加static修饰符,或者@objc修饰符添加到类(这是标记所有语法的语法糖)成员@objcMembers)。阅读documentation中的更多内容。