gpt4 book ai didi

ios - Swift 和 Objc 的互操作性——可用性不仅仅在 objc 中起作用

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

同时 here Apple 声明 Swift available 标志也应该应用于 objc,它对我不起作用。我做错了什么?


我在 Swift 文件中有以下声明:

@objc protocol Readable: AnyObject {...}

@available(iOS 10.3, *)
@objc class Reader: NSObject, Readable {...}

所以当我尝试在没有版本检查的情况下在 pre-ios-10 项目中初始化它时,让我们检查它是否产生错误。如果我在 Swift 中编写以下代码:

let tmp = Reader()

它返回一个错误:

'Reader' is only available on iOS 10.3 or newer

预期的结果。


但是,如果我在 objc 中编写以下代码:

// if (@available(iOS 10.3, *)) { // commeted out to test if it succeeds without version check
Reader *tmp = [[Reader alloc] init];
// }

构建完成,没有任何错误,而我预计会出现与 Swift 中相同的错误。


我试图用以下方式标记类(class):

  • @available(iOS 11, *)
  • @available(iOS,引入:10.3)

这些在 objc 中都不起作用(产生错误)。有什么帮助吗?

最佳答案

Objective-C 有 __attribute__((availability))@available 更长的时间。为了让它工作,Objective-C 编译器弱链接部署目标上不可用的符号。这意味着编译总是成功,并且启动您的应用程序成功,但如果符号不可用,则该符号在运行时将为 NULL。

根据它是什么,当您尝试使用它时,您或多或少会得到优雅的降级:

  • 调用缺少的弱链接函数会崩溃
  • 读取或写入丢失的全局变量将会崩溃
  • 使用缺少的类将是空操作,所有方法都将返回零

在运行时测试是否找到符号的旧方法只是将它与 NULL 进行比较:

NS_AVAILABLE_MAC(...) @interface Foo @end
int bar NS_AVAILABLE_MAC(...);
int baz(int frob) NS_AVAILABLE_MAC(...);

if ([Foo class]) { /* Foo is available */ }
if (&bar) { /* bar is available */ }
if (&baz) { /* baz is available */ }

在你的情况下:

Reader *tmp = [[Reader alloc] init];

tmp 将为 nil,因为这与 [[nil alloc] init] 相同。

@available 指令是最近才添加到 Objective-C 中的。现在可以像在 Swift 中使用 #available 一样在 Objective-C 中使用 @available 。但是,为了保持向后兼容性,尝试使用在 Objective-C 的部署目标上可能不可用的符号可能永远不会出现编译时错误(在默认错误级别)。

关于ios - Swift 和 Objc 的互操作性——可用性不仅仅在 objc 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54203615/

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