代码之家  ›  专栏  ›  技术社区  ›  Hari Honor

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

  •  1
  • Hari Honor  · 技术社区  · 6 年前

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

    注意这与 @available(iOS 8, *) 宏。我想要相反的结果:如果没有。或者更准确地说我想要 @available(iOS <10.0, *) ,“如果iOS小于10.0,则可用”

    3 回复  |  直到 6 年前
        1
  •  1
  •   zneak    6 年前

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

    1. 你正在修改CoreData,它本身已经是相当动态的,我不确定它会有什么反应。
    2. 我无法验证我在这台计算机上所说的任何内容,因此如果它不起作用,请发表评论:)

    在桥接头中,确保编译器知道 init(context:)

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

    +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: 初始化WithContext: .

        2
  •  0
  •   OOPer    6 年前

    @available(iOS, deprecated: 10.0)
    

    不过,它叫 Attributes 在斯威夫特。没有预处理器。

        3
  •  0
  •   ielyamani    6 年前

    @available(iOS, introduced: 8.0, deprecated: 10.0)
    

    或此选项以防止在当前iOS目标中使用它:

    @available(iOS, introduced: 8.0, obsoleted: 10.0)
    

    您甚至可以提供自定义消息:

    @available(iOS, introduced: 8.0, obsoleted: 10.0, message: "This is obsoleted")