Xcode7beta发布,Swift 2.0带来哪些新变化?

WWDC 2015首日,苹果发布了版本号为7A120f的Xcode 7 beta,包含了Xcode IDE、Swift 2编译器、Instruments、模拟器和最新的OS X、iOS、watchOS SDK。

Xcode 7 beta Release Notes 可以看出,Swift 2.0包含了许多非常niubility的特性,现在,在Swift中支持错误处理,如抛出(throw)、捕获(catch)、管理(manage)等,并且可以和NSError无缝交互。而当新的API需要向后兼容旧的系统版本时,如果当前API和将要部署的目标系统版本不一致,将会抛出一个编译时错误。而近来在TIOBE编程语言排行榜 呈现“自由落体”趋势的Objective-C也有着两处修改。具体更新如下:

Swift 2.0和Objective-C的更新

  • 错误处理:我们可以在Swift中构建一个函数用来抛出,捕获和管理错误。我们可以接触和处理可恢复的错误,如“file-not-found”或者网络超时,Swift和错误处理可以和NSError无缝交互。
  • 可用性检查:如果你在一个旧的部署平台上调用的一个新的系统版本引入的API时将触发一个编译时错误。我们可以在if或者guard条件语句中使用#available()函数来检查API函数的可用性:例如:
if #available(iOS 8.0, OSX 10.10, *) {
 // 当版本匹配时使用Handoff APIs.
 let activity =
 NSUserActivity(activityType:"com.example.ShoppingList.view")
 activity.becomeCurrent()
} else {
 //当版本不匹配时返回.
}
  • 你可以在你的代码声明中使用@available()属性声明来指定可用性信息。 例如:
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity {
 ...
}

指示startUserActivity()方法只在iOS8.0+,OSX10.10+以及以其他平台的全版本可用。

  • 协议的扩展性:现在可以为协议类型编写扩展,这样就可以为遵循该协议的任意类增加方法或者属性,极大重用我们的代码。
  • 协议默认实现:现在可以为协议扩展中指定的需求提供一个默认实现,这样便可以使用诸如“mixin”和“trait”的模式。
  • 新的defer语句:这个语句在代码生命周期结束时用来做清理的工作,该特性在并发开发时使用新的错误处理模型时非常有用。例如:
let f = fopen("x.txt", "r")
 defer { fclose(f) }
 try foo(f) // f会关闭如果错误产生的话.
 let f2 = fopen("y.txt", "r")
 defer { fclose(f2) }
 try bar(f, f2) // 如果错误产生f2关闭,接着f关闭。
} // f2关闭, 如果没有任何错误产生f关闭。
  • 新的guard语法:这个新的语法允许你在一个代码周期中构建一个提前的退出点。例如:
guard let z = bar() else { return }
这里的else语句被用于退出代码块(和return、throw、break、continue等类似),或者终止调用一个@noreturn属性修饰的函数。
  • 增强化的模式匹配:switch/case的模式匹配现在在很多新的条件流程控制语句中可用,这包括if/case,while/case,guard/case和for-in/case、for/in,同时也允许使用“where”判断。
  • 新的do语句:在do语句中支持代码块嵌套,例如:
do {
 //new scope
 do {
 //another scope
 }
}
  • 可测试性:关于Swift2.0框架和App的测试现在不需要将内部功能代码路由到public代码了。在待测试代码中使用@testable import {ModuleName}语法使所有的内部私有和public出来的代码可用。App或者framework的target在编译时需要启用“Enable Testability”编译设置。这个“Enable Testability”编译属性只能在Debug配置中可用,因为它需要导出内部符号信息从而妨碍代码优化。
  • 对C函数指针的支持:以函数指针作为函数参数的C函数将会使用闭包或者全局的函数的方式调用,由于这个限制,所以闭包不能捕获其上下文环境。例如,标准C库函数qsort将会按照如下方式调用:
var array = [3, 14, 15, 9, 2, 6, 5]
qsort(&array, array.count, sizeofValue(array[0])) { a, b in
 return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory)
}
print(array)
  • 增强的诊断信息:增加了一个新的警告信息用来在尽可能的情况下鼓励使用let而不是var。同时也增加了新的警告信息来提示未使用的变量,无法触发的switch case分支判断等,同时对于switch语句耗尽的判断更加智能。
  • SIMD支持:Clang中扩展的矩阵算法在swift中可以导入并使用了,大数据量的图形算法或者其他系统级别的数据运算在Swift实现成为可能。
  • 枚举中现在支持多泛型关联值,例如:
enum Either<T, U> {
 case Left(T), Right(U)
}
  • 打印特定枚举类型值时现在可以显示枚举值和附带的值了,但是这个对于@objc类型的枚举类型或者含有多附带值的枚举类型不支持。
  • 现在允许对泛型类型编写公共扩展(Public)了。例如:
public extension Array { … }
  • 非泛型的类可以继承自泛型的类了。
  • Swift字符串字面量的拼接,包括跨行文本,现在确保能够进行编译时优化。
  • 可失败便捷构造器现在允许在调用self.init前调用return nil语句。指定构造器在返回nil之前必须初始化所有的存储属性,这是一个已知的限制。
  • 内嵌函数现在可以递归引用函数本身或者其他的内嵌函数。
  • if条件语句现在支持标签化了,可以使用break去跳出一个标签化的if判断。注意不带标签的break语句只能使用在循环或者switch/case语句中而不能用在if中。
  • 一个新的x?语句用来匹配可选类型。
  • 一个新的@nonobjc属性用来选择性的禁止实例的导出,这个和@objc相对应。
  • 在标准库中增加了一个新的函数:readLine()

Playground

  • 富文本注释: 采用Markdown样式的语法来解释代码的功能。
  • 内联结果: 在代码的下方直接显示代码的输出的结果。
  • 资源: 允许使用项目导航器面板向Playground中增加诸如图片一样的资源。
  • 辅助代码: 在Playground本身之外保留额外的代码用作辅助功能。
  • 分页: 采用Bundle类似的方式来组织Playground结构。

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
2022-12-16 14:39
门头沟学院_2024
点赞 评论 收藏
转发
头像
2022-12-27 14:49
韶关学院_2022
点赞 评论 收藏
转发
头像
2022-12-22 00:27
中南大学_2023
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
2022-12-27 14:35
天津大学_2023
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
2022-12-22 16:38
江苏大学_2023
点赞 评论 收藏
转发
点赞 收藏 评论
分享

全站热榜

正在热议