iOS 混编|限制 API 可用性

2,417 阅读1分钟

关键词:NS_SWIFT_UNAVAILABLE、NS_UNAVAILABLE、available

Unavailable

  • 使用 NS_SWIFT_UNAVAILABLE 宏使 Objective-C API 在 Swift 中不可用
  • 使用 NS_UNAVAILABLE 宏使 Objective-C API 在 Objective-C 和 Swift 中都不可用

NS_SWIFT_UNAVAILABLE

在混编时,如果 Objective-C 中某些 API 不适用于 Swift,可以使用 NS_SWIFT_UNAVAILABLE 宏让这些 API 在 Swift 中不可用,并指定一个字符串错误信息提示调用者应该怎么做(例如用其它 API 替代)。当尝试在 Swift 中调用使用 NS_SWIFT_UNAVAILABLE 标记的 API 时会产生编译错误,并得到指定的错误提示。

+ (instancetype)collectionWithValues:(NSArray *)values
                             forKeys:(NSArray<NSCopying> *)keys
NS_SWIFT_UNAVAILABLE("Use a dictionary literal instead.");

NS_UNAVAILABLE

如果要让 Objective-C API 在 Objective-C 和 Swift 中都不可用,可以使用 NS_UNAVAILABLE 宏,但它不支持自定义的错误信息。

- (instancetype)init NS_UNAVAILABLE;

在 Apple 库里也有看到使用 OBJC_SWIFT_UNAVAILABLE 宏的,用法同 NS_SWIFT_UNAVAILABLE

+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");

Available

标记可用性

// Objective-C
@interface MyViewController : UIViewController
- (void)newMethod API_AVAILABLE(ios(11), macosx(10.13));
@end

// Swift
@available(iOS 11, macOS 10.13, *)
func newMethod() {
    // Use iOS 11 APIs.
}

检查可用性

// Objective-C
if (@available(iOS 11, *)) {
    // Use iOS 11 APIs.
} else {
    // Alternative code for earlier versions of iOS.
}

// Swift
if #available(iOS 11, *) {
    // Use iOS 11 APIs.
} else {
    // Alternative code for earlier versions of iOS.
}

参考

推荐阅读