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.要使用不同的模块而不是属于两个目标的文件,以使ObjC代码可以访问成员(也是静态的),您需要向它们添加
@ObjC
修饰符,或者向类添加@objcMembers
修饰符(这是用@ObjC
标记所有成员的语法糖)。阅读更多信息。您是否尝试在课堂上使用@objcMembers
?或直接在共享立场上使用@objc
?@PPL,我认为最新swift的回答范围不再有效。使用共享扩展目标时,即使它声明为静态let,我也可以访问共享实例。我的问题是,我在构建主要目标时无法达到目标。@MilanNosáľ与OBJC成员一起工作。请将其作为一个解决方案提出,如果您提供有关OBJC成员用法的简短解释或直接链接到Apple文档,那将是一件好事。非常感谢。我猜扩展模块swift版本是“3”,因此这适用于扩展,而主目标的swift版本是“4”,如果不添加objcMembers,它将不再为类的所有成员生成接口。谢谢你的回答。