Swift/Oj-C互操作:防止基础类桥接



我在NSLocale上有一个Obj-C类别,实现了这些只读属性:

@property (class, nonatomic, nonnull, readonly) NSLocale *searchLocale;
@property (nonatomic, nonnull, readonly) NSString *extendedLanguageCode;

现在,当我想从Swift访问它时,我必须编写(NSLocale.search as NSLocale).extendedLanguageCode。有没有办法避免选角到NSLocale?

我知道我可以写这样的Swift扩展:

extension Locale {
var extendedLanguageCode: String {
(self as NSLocale).extendedLanguageCode
}
}

然而,这并不能很好地扩展。我有多个属性,我需要所有这些属性的粘合代码。

因此,我正在寻找一个开关来告诉编译器,对于特定的类属性,它不应该应用从NSLocale到Locale的桥接,并且实际上在Swift中返回一个NSLocale。

知道怎么解决这个问题吗?

解决作弊显然不能阻止Foundation类的自动桥接。

@interface MyLocale : NSLocale
@end
@interface NSLocale (YourCategory)
@property (class, nonatomic, nonnull, readonly) MyLocale *search;
@property (nonatomic, nonnull, readonly) NSString *extendedLanguageCode;
@end

现在在Swift中,您可以使用

_ = NSLocale.search.extendedLanguageCode

然而,我在这里发现了一组很有前途的Clang属性(查看自定义Swift导入部分(https://clang.llvm.org/docs/AttributeReference.html#swift-桥梁。

更新
我只能有效地使用

@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_name("search2")));

&

@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_private));

本质上是为该房产提供一个自定义的Swift名称或将其私有化。不是特别令人印象深刻。

不,您无法摆脱转发到Objective-C实现的扩展。

这是因为Swift的LocaleNSLocale上的ReferenceConvertible,所以在NSLocale上添加的任何新方法/属性也需要在Swift结构端实现。这是古老的经典"继承之上的合成";图案

在缩放问题上,我在一定程度上同意,但在NSLocale上可以添加多少方法来解决问题?:(

最新更新