Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c SWIFT /Obj-C互操作:防止基础类桥接?_Objective C_Swift - Fatal编程技术网

Objective c SWIFT /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

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

@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类别时,我可以在Swift
String
s上调用它们的方法。不知道为什么String/NSString的行为会不同。感谢您提到了叮当声属性。我很想知道它们的详细功能。添加了一个更新,但没有什么特别之处。基本上是NS_SWIFT_名称和NS_精炼_FOR_SWIFT宏的功能。
@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_private));