gpt4 book ai didi

objective-c - Swift/Obj-C 互操作 : Prevent bridging of Foundation classes?

转载 作者:行者123 更新时间:2023-12-03 18:57:27 25 4
gpt4 key购买 nike

我在实现这些只读属性的 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。
知道如何解决这个问题吗?

最佳答案

作弊的解决方法显然不会阻止基础类(class)的自动桥接。

@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-bridge .
更新
我只能有效地使用
@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_name("search2")));
&
@property (class, nonatomic, nonnull, readonly) NSLocale* search __attribute__((swift_private));
本质上是给属性一个自定义的 Swift 名称或使其私有(private)。不是特别令人印象深刻。

关于objective-c - Swift/Obj-C 互操作 : Prevent bridging of Foundation classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65570094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com