【问题标题】:Hide an Objective-C initializer (or method) from Swift从 Swift 隐藏 Objective-C 初始化程序(或方法)
【发布时间】:2015-08-18 23:28:07
【问题描述】:

我有一个 Framework 有一个 Objective-C 类和一个指定的初始化器,它需要两个 NSArrays。在 Framework 中,我定义了一个 Swift 扩展,它提供了一个额外的初始化程序,它接受一个元组数组而不是两个数组。

当永久导入 Framework 时,是否可以从 Swift 中隐藏原始 Objective-C 初始化程序(所以只有初始化程序采用可以使用元组数组)但在使用 Objective-C 代码中的 Framework 时保持它可用?

【问题讨论】:

    标签: objective-c swift initialization


    【解决方案1】:

    @mattt 回答:

    使用 NS_SWIFT_UNAVAILABLE 宏(仅适用于 Xcode 7 及更高版本)。

    【讨论】:

      【解决方案2】:

      你可以:

      YourApp-Brinding-Header.h

      #define __BRIDGING__
      #import "YourObjCObject.h"
      #undef __BRIDGING__
      

      YourObjCObject.h

      #import <Foundation/Foundation.h>
      
      @interface YourObjCObject : NSObject
      
      @property (assign, nonatomic) NSInteger count;
      
      - (instancetype)initWithArray:(NSArray *)ary1 Array2:(NSArray *)ary2 NS_DESIGNATED_INITIALIZER
      #ifdef __BRIDGING__
      NS_UNAVAILABLE
      #endif
      ;
      @end
      

      【讨论】:

      • 顺便说一句,如果你从 Swift 中隐藏 designated initializer,你如何在 Swift 扩展中实现 convenience intializer
      • 是的,这是我的问题的一部分。我想在我自己的便利初始化程序上使用它,但我想将它隐藏在其他地方。如果这不可能,我可以从 Swift 重新实现 designated initializer。此外,还有一个问题,这是在没有桥接头的框架内(如here 所述)。框架用户能否实现我请求的行为?
      • 或者换句话说,是否可以从预处理器宏中检测到 usage from Swift 而无需像在您的解决方案中那样手动定义__BRIDGING__
      • 那么,这个 QA 可能对您有帮助吗? How to import private framework headers in a Swift framework?.
      • 谢谢,很有希望!但是,我仍然看不到从 Framework 之外做我想做的事情的方法:让 Obj-C 初始化程序可从 Obj-C 获得,但只有 Swift 提供的 Swift 初始化程序。我已经更新了问题以反映这一点。我会阅读Clang Modules documentation,看看能不能找到合适的。
      猜你喜欢
      • 2014-07-29
      • 2017-06-10
      • 2023-03-15
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多