Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从目标C代码访问静态let sharedInstance_Ios_Objective C_Swift_Mix And Match - Fatal编程技术网

Ios 无法从目标C代码访问静态let sharedInstance

Ios 无法从目标C代码访问静态let sharedInstance,ios,objective-c,swift,mix-and-match,Ios,Objective C,Swift,Mix And Match,问题: @objc public protocol ManagedObjectContextProvider { var context: NSManagedObjectContext { get } } @objc public final class ManagedObjectContextProviderImpl: NSObject, ManagedObjectContextProvider { public static let shared

问题:

    @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()
    }
}
在构建主应用程序目标时,无法从目标C代码访问声明的静态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()
    }
}
上下文:

    @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到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
    
    @class NSManagedObjectContext;
    SWIFT_协议(“TtP428ManagedObjectContextProvider”)
    @协议ManagedObjectContextProvider
    @属性(非原子、只读、强)NSManagedObjectContext*\u非空上下文;
    @结束
    SWIFT类(“TtC432ManagedObjectContextProviderImpl”)
    @接口ManagedObjectContextProviderImpl:NSObject
    -(非空instancetype)初始化SWIFT_不可用;
    @属性(非原子、只读、强)NSManagedObjectContext*\u非空上下文;
    @结束
    
  • 在共享扩展的swift到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
    
    @class NSManagedObjectContext;
    SWIFT_协议(“TtP428ManagedObjectContextProvider”)
    @协议ManagedObjectContextProvider
    @属性(非原子、只读、强)NSManagedObjectContext*\u非空上下文;
    @结束
    SWIFT类(“TtC432ManagedObjectContextProviderImpl”)
    @接口ManagedObjectContextProviderImpl:NSObject
    SWIFT_CLASS_属性(@PROPERTY(非原子、类、只读、强)id_非空sharedInstance;)
    +(id非空)sharedInstance SWIFT警告未使用结果;
    -(非空instancetype)初始化SWIFT_不可用;
    @属性(非原子、只读、强)NSManagedObjectContext*\u非空上下文;
    @结束
    
  • 上面指定的MyAppName是生成Swift to Obj C头时使用的模块名称,对于主目标和共享扩展都是相同的

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

不建议作为解决方案的内容:
1.要使用不同的模块而不是属于两个目标的文件,以使ObjC代码可以访问成员(也是静态的),您需要向它们添加
@ObjC
修饰符,或者向类添加
@objcMembers
修饰符(这是用
@ObjC
标记所有成员的语法糖)。阅读更多信息。

您是否尝试在课堂上使用
@objcMembers
?或直接在
共享立场上使用
@objc
?@PPL,我认为最新swift的回答范围不再有效。使用共享扩展目标时,即使它声明为静态let,我也可以访问共享实例。我的问题是,我在构建主要目标时无法达到目标。@MilanNosáľ与OBJC成员一起工作。请将其作为一个解决方案提出,如果您提供有关OBJC成员用法的简短解释或直接链接到Apple文档,那将是一件好事。非常感谢。我猜扩展模块swift版本是“3”,因此这适用于扩展,而主目标的swift版本是“4”,如果不添加objcMembers,它将不再为类的所有成员生成接口。谢谢你的回答。