gpt4 book ai didi

ios - 静态让 sharedInstance 无法从 Objective-C 代码访问

转载 作者:可可西里 更新时间:2023-11-01 01:09:20 26 4
gpt4 key购买 nike

问题:

在构建主要应用程序目标时,无法从 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 个目标中 [main iOS App and Share extension]

  • 在主应用的 swift to objc 生成 header 中,swift 类的接口(interface)生成如下:

      @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 生成 header 中,swift 类的接口(interface)正确生成并且是:

      @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 header 时使用的模块名称,并且对于主要目标和共享扩展都是相同的

我尝试过的:

  1. 在两个 header 中复制相同的类声明[欺骗编译器,但在运行时因“无法识别的选择器”而失败]
  2. 修改扩展的模块名称,使其与目标模块名称不同

什么不建议作为解决方案:

  1. 使用不同的模块而不是属于 2 个目标的文件

最佳答案

要使成员(也是 static)可被 ObjC 代码访问,您需要向它们添加 @objc 修饰符,或 @objcMembers 修饰符类(这是用 @objc 标记所有成员的语法糖)。在 documentation 中阅读更多内容.

关于ios - 静态让 sharedInstance 无法从 Objective-C 代码访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49006246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com