首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift和Objc互操作性-可用性不只是在objc中工作

Swift和Objc互操作性-可用性不只是在objc中工作
EN

Stack Overflow用户
提问于 2019-01-15 17:03:22
回答 1查看 475关注 0票数 2

虽然这里苹果公司声明Swift available标志也应该应用在objc中,但它并不适用于我。我做错了什么?

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

代码语言:javascript
复制
@objc protocol Readable: AnyObject {...}

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

因此,当我尝试在没有版本检查的预IOS-10项目中初始化它时,让我们检查它是否会产生错误。如果我用Swift编写以下代码:

代码语言:javascript
复制
let tmp = Reader()

它返回一个错误:

“阅读器”仅可在iOS 10.3或更高版本上使用

所期待的。

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

代码语言:javascript
复制
// if (@available(iOS 10.3, *)) { // commeted out to test if it succeeds without version check
    Reader *tmp = [[Reader alloc] init];
// }

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

我试着用:

  • @查阅(iOS 11,*)
  • @查阅(iOS,简介: 10.3)

在objc中,这两种方法都不能工作(产生错误)。有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 17:57:32

目的-C期__attribute__((availability))的发生时间比@available期长。为使其工作,Objective编译器弱链接部署目标上不可用的符号。这意味着编译总是成功的,启动应用程序也会成功,但是如果没有可用的代码,则在运行时这个符号将为NULL。

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

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

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

代码语言:javascript
复制
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 */ }

就你而言:

代码语言:javascript
复制
Reader *tmp = [[Reader alloc] init];

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54203615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档