问题:
在构建主应用程序目标时,无法从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()
}
}
上下文
在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个目标的文件
答案 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中的更多内容。