[Swift2.0系列]API可用性检查(译)

Swift2.0:API可用性检查

Swift安全至上。除了Swift2.0引入的API(应用程序编程接口)可用性检查之外,另外还新增一些非常棒的功能使得你的应用程序更加稳定。

每年Apple发布新的iOS重大更新之时,都将引入新的功能以及API。但是它们并不能兼容先前的iOS版本,导致你不得不谨慎对待这些新的API

设想应用程序的部署目标是iOS 8(即只有iOS 8.0以上的设备才能安装该程序),同时又要支持force touch功能。对于低于iOS 9版本的系统,有如下几种方式可以避免在iOS 8系统下调用iOS 9的API。

方式一:

// 以下为译者注解:
// respondsToSelector用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
// 只有iOS 9 才有forceTouchCapability方法。
if traitCollection.respondsToSelector(Selector("forceTouchCapability")) {
     // 检查ForceTouch是否可用 倘若可用 进行配置
     if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
          //配置 Force touch
     }
}

方式二:

// 判断是否在iOS9能够正常工作
if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 9, minorVersion: 0, patchVersion: 0)) {
    // 判断force touch 是否可用
     if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
          //配置 Force touch
     }
}

以上这些解决方案的问题在于,你必须对所有检查都做到面面俱到.一旦你忘记检查新API的可用性,应用程序在旧版本中运行将导致崩溃。

不过,在Xcode7Swift2.0下,以上两个范例均无法编译通过。你必须使用#available关键字来进行API可用性检查,如此就能解决编译器报错了。因此在Swift2.0中你的代码应该这么写:

// 检查当前设备系统是否在iOS 9下可用
if #available(iOS 9.0,*){
    // 可用情况下 才执行如下代码
    if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
          //configure force touch
     } 
}else {
         // Fallback on earlier versions
 }  

Guard

此外,使用guard来进行API可用性检查也不失为一个良策。

func configureForceTouch() {
     // guard只有满足条件下才进行下一步 不满足则直接跳出程序
     guard #available(iOS 9.0, *) else {
          return
     }

     if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
         //configure force touch
     }        
}

例子中,倘若运行在设备上的系统版本小于等于iOS9.0,那么函数就会直接跳出。

类和方法

当然我们还可对类和方法执行可用性检查。在这种情况下,必须使用@available,而非#available:

@available(iOS 9.0, *)
     func configureForceTouch() {
          if (traitCollection.forceTouchCapability == UIForceTouchCapability.Available) {
               //configure force touch
           }    
     }
}

平台的检查

你同样能够对除iOS之外的平台进行检查。例如,检查应用程序是否支持在Mac OSX 10.10版本以上运行。

if #available(iOS 9.0, OS X 10.10, *) {
    // runs on iOS 9 and OS X 10.10
}

你可能好奇这个"*"星号有啥用?它代表了所有其他平台以及所有未来可能出现的平台。你必须它,即使你仅在iOS下使用。除以之外,你还可以明确watchOS以及tvOS的版本(当然只支持Xcode Beta 7.1之后)。

if #available(OSX 10.0, iOS 9, watchOS 2, tvOS 1, *) {
     // runs on OS X 10.0, iOS 9, watchOS 2 and tvOS 1
}

总结: API可用性检查功能保证了代码的安全性。不过,为了在旧项目中使用iOS 9 SDK,你不得不做一些必要的迁移工作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,695评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,120评论 19 139
  • 时间不等人,爱因斯坦在他最后几年光阴里开始探索大一统理论,就连他卧床不起濒死的那几个小时里他都在写笔记。我想一个伟...
    neozhang阅读 1,765评论 0 1
  • 今年看去年发现很多沟通是错误的,发现很多想法是想当然的。 一直想着自己要怎么怎么,最后也没达成啥,这样很可悲,人生...
    ebf8bf373fdf阅读 1,607评论 0 0
  • 一 ERR 1067引发的血案 今天在Navicat中运行sql语句创建数据表出现了错误Err 1067。而这条语...
    龙腾九天ly阅读 21,023评论 0 4

友情链接更多精彩内容