【问题标题】:Invert Objective-C @available?反转Objective-C @available?
【发布时间】:2023-03-04 02:19:01
【问题描述】:

最近添加到 Objective-C 的 @available 可能很方便,但显然是短视的..

任何存在超过几周的应用都需要定位,例如多个 macOS 版本。

不幸的是,唯一的@available 构造显式地针对较旧的 OS 版本似乎可以工作(从Xcode 到并包括12)很麻烦

  if (@available(macOS 11.0, *))
  {
     // all hunky-dory: no-op
  }
  else
  {
     // legacy work arounds
     ...
     ...
  }

只使用带有否定的 else 分支会发出可怕的@available 不会在这里保护可用性编译器警告..
有什么方法可以简化这个可怕的代码并删除虚拟的 no-op 分支?

【问题讨论】:

    标签: objective-c xcode macos cocoa


    【解决方案1】:

    你可以使用预处理器,定义一个宏:

    #define ifNotAvailable(A, B) if (@available(A, B)) {} else
    

    然后将代码编写为:

    ifNotAvailable(macOS 11.0, *)
    {
       // legacy work arounds
       ...
       ...
    }
    

    这是否不那么“可怕”在旁观者的眼中,YMMV!

    【讨论】:

    • 当然,任意语言扩展和变通方法总是可以使用预处理器构建 - 但我一直在寻找一种通用的内置解决方案..
    • 不清楚您的意思是“普遍可用”。如果您希望宏在 Xcode 项目中的任何地方“自动”可用,您可以将它放在单独的 .h 中并设置构建设置 Prefix Header 以引用此文件 - 使用项目相关小路。 (此构建设置转换为 -include 编译器选项,因此如果使用 makefile 或命令行,您可以执行类似的操作。)
    • 鼓励您也前往https://feedbackassistant.apple.com/ 并建议Apple 对Objective-C 和Swift(没有宏,因此缺乏Objective-C 的简单解决方法)添加否定。提供一个有说服力的论据,你永远不会知道......
    猜你喜欢
    • 2018-03-05
    • 2018-04-08
    • 2017-10-24
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多