gpt4 book ai didi

Swift:如何使用预处理器为*低于*某个 iOS 版本添加扩展方法?

转载 作者:行者123 更新时间:2023-11-28 05:52:01 27 4
gpt4 key购买 nike

我正在尝试为 iOS9 以下的 NSManagedObjects init(context:) 方法“polyfill”。有没有办法为 iOS10 进行预处理器可用性检查?

这是否有意义,或者是否会出现链接冲突问题,因为我们不知道用户将运行哪个 iOS 版本?

请注意,这与 @available(iOS 8, *) 不同。宏。我想要相反的东西:如果不可用。或者更准确地说,我想要类似 @available(iOS <10.0, *) 的东西, "iOS 低于 10.0 时可用"

最佳答案

我认为仅仅依靠 Swift 中的编译时操作是不可能的。如果您愿意,通过在 Objective-C 中编写一个定义该方法的扩展,您的实现将在平台存在时覆盖它,因此这可能是一个可行且简单的解决方案。

如果您只希望您的实现仅在没有 native 实现时才启动,那么您也应该能够在 Objective-C 中轻松地做到这一点。首先,我有两个警告:

  1. 您正在修改 CoreData,它本身已经非常动态,我不确定它会如何 react 。
  2. 我无法验证我在这台计算机上所说的任何内容,所以如果它不起作用请发表评论:)

在桥接 header 中,确保编译器知道 init(context:) 可用,无论 iOS 版本如何:

@interface NSManagedObject ()
+(void)initialize;
-(instancetype)initWithContext:(NSManagedObjectContext* _Nonnull)ctx;
@end

+initialize 在类别中声明的方法的执行独立于该类是否有 +initialize 方法本身或任何其他类别是否有一个。

实现将如下所示:

@implementation NSManagedObject ()

static id initWithContext(NSManagedObject* self, SEL sel, NSManagedObjectContext* context) {
// your implementation goes here
}

+(void)initialize {
SEL init = @selector(initWithContext:);
if (![self instancesRespondToSelector:init]) {
class_addMethod(self, init, (IMP)initWithContext, "@:@");
}
}

@end

在我看来,这相当简单:检查 NSManagedObject 是否支持 initWithContext:,如果不支持,请添加您自己的实现。您无需提供 initWithContext: 的显式实现。

关于Swift:如何使用预处理器为*低于*某个 iOS 版本添加扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594735/

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