Objective c SWIFT /Obj-C互操作:防止基础类桥接?
我在NSLocale上有一个Obj-C类别,实现了以下只读属性:Objective c SWIFT /Obj-C互操作:防止基础类桥接?,objective-c,swift,Objective C,Swift,我在NSLocale上有一个Obj-C类别,实现了以下只读属性: @property (class, nonatomic, nonnull, readonly) NSLocale *searchLocale; @property (nonatomic, nonnull, readonly) NSString *extendedLanguageCode; 现在,当我想从Swift访问它时,我必须编写(NSLocale.search as NSLocale).extendedLanguageCod
@property (class, nonatomic, nonnull, readonly) NSLocale *searchLocale;
@property (nonatomic, nonnull, readonly) NSString *extendedLanguageCode;
现在,当我想从Swift访问它时,我必须编写(NSLocale.search as NSLocale).extendedLanguageCode
。有没有一种方法可以避免对NSLocale进行强制转换
我知道我可以这样写一个快速扩展:
extension Locale {
var extendedLanguageCode: String {
(self as NSLocale).extendedLanguageCode
}
}
然而,这并不能很好地扩展。我有多个属性,我需要为所有属性编写这样的粘合代码
因此,我正在寻找一个开关来告诉编译器,对于特定的类属性,它不应该应用从NSLocale到Locale的桥接,而是实际返回Swift中的NSLocale
如何解决这个问题?
< P>作弊显然不妨碍基础类的自桥接。@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
然而,我在这里发现了一组很有希望的叮当声属性(请查阅定制Swift导入部分)
更新我只能有效地使用
@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_name("search2")));
&
本质上是给财产起一个自定义的Swift名称,或者将其私有化。不太令人印象深刻。不,您无法摆脱转发到Objective-C实现的扩展 这是因为Swift的
Locale
是NSLocale
上的ReferenceConvertible
,因此您在NSLocale
上添加的任何新方法/属性也需要在Swift结构端实现。这是一个古老的经典“组合重于继承”模式
在缩放问题上,我在某种程度上是同意的,但是您可以在
NSLocale
上添加多少方法来解决问题呢?:) 可能相关,但尚未解决:有趣的是,当我在NSString
上实现Obj-C类别时,我可以在SwiftString
s上调用它们的方法。不知道为什么String/NSString的行为会不同。感谢您提到了叮当声属性。我很想知道它们的详细功能。添加了一个更新,但没有什么特别之处。基本上是NS_SWIFT_名称和NS_精炼_FOR_SWIFT宏的功能。
@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_private));