我在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的Locale
是NSLocale
上的ReferenceConvertible
,所以在NSLocale
上添加的任何新方法/属性也需要在Swift结构端实现。这是古老的经典"继承之上的合成";图案
在缩放问题上,我在一定程度上同意,但在NSLocale
上可以添加多少方法来解决问题?:(