加载中 ...
首页 > 新闻资讯 > 软件定制 正文

Xcode 8.0 Beta发布,详解Swift语言的重大变化

2019-03-25 10:23:49 来源:沈阳软件公司 作者:沈阳软件开发

  

  Playground中的video标签支持远程的URL。

  

  4. Swift语言的变化

  

  Xcode 8.0 Beta中包含Swift 3和Swift 2. 3两个版本的预发布版本。如果没有特别说明的话,Xcode 8默认采用Swift 3语法版本。其中的“SE-XXXX” 数字指向的是 “Swift语法演进” 建议的序号,小伙伴们可以通过Swift Evolution查看具体的信息。对于现有的代码可以在Xcode中通过菜单“Edit -> Convert -> To Latest Swift Syntax …”转换到最新的语法。

  

  Swift中的Objective-C导入机制和标准库接口已被修正并且遵循新的API规范,此举的目的是可以为小伙伴们提供统一、简洁一致性的接口。[SE-0023] [SE-0005] [SE-0006]

  

  增加了一个新的属性swift_name。该属性允许C API的作者指定他们的API如何导入到Swift中。[SE-0044]

  

  增加了新的属性,对于Objective-C中的常量列表,这个属性可以将其以Enum枚举或者结构体Struct的方式导入到Swift中,并且可以通过RawRepresentable协议将其转换到它原始类型。[SE-0033]

  

  隐式解封可选类型的行为有所变化,“!”语法(如NSObject!)现在只允许用于变量、常量、参数和返回的结果值类型上。隐式解封类可选类型的值依然可以用在非可选的类型上,但是对于泛型特性来说则需要指定明确的可选类型。

  

  比如:

  

  var x: Int! = nil   // x是类型 Int?的隐式解封可选类型值

  

  var y = x        // y是Int?类型的基本可选类型值

  

  var z = x ?? 0    // x将会被当作可选类型; 因为x是nil, z 将会赋值为0

  

  print(x + 0)      // x因为会被隐式解封为nil,所以这里将会导致异常中断。

  

  函数参数具备行为一致的标签系统,这个更新将使第一个参数的标签声明与其他的参数声明保持一致。比如:

  

  func foo(x: Int, y: Int) {}

  

  foo(1, y: 2)

  

  func bar(a a: Int, b: Int) {}

  

  bar(a: 3, b: 4

  

  现在改变为:

  

  func foo(_ x: Int, y: Int) {}

  

  foo(1, y: 2)

  

  func bar(a: Int, b: Int) {}

  

  bar(a: 3, b: 4)

  

  小伙伴们看出差异了没?以前的Swift语法对于第一个参数的标签用法很奇怪,需要通过显式地提供外部参数名才可以使用指定参数标签,如果不指定则省略调用。而新的语法版本支持外部参数名和内部参数名一致,当然可以通过下划线来忽略外部参数标签。

  

  对于未使用的结果值默认情况下编译器会报警。[SE-0047]

  

  柯里化函数声明被移除,这么怪异用法留着何用,删除了更好。[SE-0002]

  

  “++“和”—“自变量运算符被移除,遥想当年自增自减,前自增后自增,前减,后减害死了多少小伙伴啊。[SE-0004]

  

  C风格的循环方式被移除。[SE-0007]

  

  在调用中的元组的隐式扩展特性被移除,华而不实特性移除了语法系统会更清晰。[SE-0029]

  

  很多关键字现在可以用作类型的成员名称而不需要用反引号特别标注。比如你的类型foo有一个成员名为default,但是default本身是一个关键字,你依然可以这么写foo.default。[SE-0071]

  

  对于CF类型名称的Ref格式的命名方式从Swift中被移除,比如现在用CFString而不是用CFStringRef。有一个例外就是对于同时有类型Foo和FooRef名称时,而FooRef又是一个Core Function类型,这种情况下则会继续沿用的方式。

  

  引入了新的表达式 #file, #sourceLocation, #column和 #function来替代现有的FILE, LINE, COLUMN和FUNCTION符号, FILE类型的符号被移除。[SE-0028] [SE-0034]

  

  对于默认参数在调用时的顺序依然需要与函数声明时的顺序相一致。[SE-0060]

  

  函数类型语法被标准化,需要在参数列表两侧必须有圆括号。[SE-0066]

  

  对于Objective-C中轻量级的泛型类可以直接以泛型类型的方式导入到Swift中,因为Objective-C中的泛型不是运行时泛化的,所以在在Swift中行为有一些限制[SE-0057]:

  

  如果ObjC泛型类用在”as?”, “as!” 或者“is“转换类型中,泛型参数在运行时不会被检查。只有操作数是一个ObjC类才会转换成功。

“沈阳软件公司”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与

我们联系删除或处理,客服QQ:55506560,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同

其观点或证实其内容的真实性。