- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
同时 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):
这些在 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/
我是一名优秀的程序员,十分优秀!