Xcode 7 beta发布,Swift 2.0带来哪些新变化?(二)

更新时间:2015-06-11 09:42:57点击次数:1510次

详解Swift语言的改变


  • OS X 10.11、iOS 9和watchOS 2 SDK采纳了一些Objective-C的特性用来提高Swift的编程体验,如可空性、类型化集合和一些别的特性。

  • 标准库中重构了很多泛型的全局函数(如map、filter和sort),采用协议扩展方式增加这些方法。这个好处是对于其他的关联类型能很好的适配。

  • 方法和函数现在使用同样的参数命名规则了,我们可以用“_”符号来省略一个外部的参数名,为了简化使用,用来指定参数名的简化符号“#”被移除,因为Swift为默认参数提供了特殊的规则:


声明:


[cpp] view plaincopy

  1. func printFunction(str: String, newline: Bool)  

  2. func printMethod(str: String, newline: Bool)  

  3. func printFunctionOmitParameterName(str: String, _ newline: Bool)  


调用:


[cpp] view plaincopy

  1. printFunction(“hello”, newline: true)  

  2. printMethod(“hello”, newline: true)  

  3. printFunctionOmitParameterName("hello"true)   



  • NS_OPTIONS类型现在遵循OptionSetType协议,这样可以避免set样式的接口调用:


避免采用如下位运算的调用方式:


[cpp] view plaincopy

  1. // Swift 1.2:  

  2. object.invokeMethodWithOptions(.OptionA | .OptionB)  

  3. object.invokeMethodWithOptions(nil)  

  4. if options & .OptionC == .OptionC {  

  5.  // .OptionC被设置  

  6. }  


选项设置支持字面量语法和set样式的调用,如contains:


[cpp] view plaincopy

  1. object.invokeMethodWithOptions([.OptionA, .OptionB])  

  2. object.invokeMethodWithOptions([])  

  3. if options.contains(.OptionC) {  

  4.  // .OptionC is set  

  5. }  



  • 在Swift中一个新的Option设置类型可以采用结构体遵循OptionSetType协议的方式编写。如果该类型中指定了一个rawValue属性和static let的常量定义,那么标准库将会为其他选项提供默认实现:



[cpp] view plaincopy

  1. struct MyOptions: OptionSetType {  

  2.  let rawValue: Int  

  3.  static let TuringMachine = MyOptions(rawValue: 1)  

  4.  static let LambdaCalculus = MyOptions(rawValue: 2)  

  5.  static let VonNeumann = MyOptions(rawValue: 4)  

  6. }  

  7. let churchTuring: MyOptions = [.TuringMachine, .LambdaCalculus]   



  • do/while循环被重名为repeat/while,这样更加显而易见:


Swift 1.2:


[cpp] view plaincopy

  1. do {  

  2. ...  

  3. while <condition>  


Swift 2.0:


[cpp] view plaincopy

  1. repeat {  

  2. ...  

  3. while <condition>   



  • println和print被合并成一个print函数,并带有一个默认的参数:


Swift 1.2:


[cpp] view plaincopy

  1. func print(<stuff to print>)  

  2. func println(<stuff to print>)  


Swift 2.0:


[cpp] view plaincopy

  1. func print(<stuff to print>, appendNewline: Bool = true)  



  • Swift的文档注释现在基于Markdown语法。


参数纵览语法:


[cpp] view plaincopy

  1. - Parameters:  

  2.  - x: ...  

  3.  - y: ...  


单独参数语法:


[cpp] view plaincopy

  1. - parameter x: ...  

  2. - parameter y: ..  


返回值:


[cpp] view plaincopy

  1. - returns: ...  


其他需要在QuickHelp中高亮的语法字段,可以参考Markdown语法。


  • CFunctionPointer<T -> U> 类型被移除,C函数现在使用新的@convention(c)属性声明,和其他函数类型一样,@convention(c) T->U是一个非空的除非是它是可选的。@objc_block属性由@convention(block)取代。

  • 类型标注不能用于模式匹配,而需要作为标注声明的一部分:


这意味着,以前的这样的写法:


[cpp] view plaincopy

  1. var (a : Int, b : Float) = foo()  


需要被重构为:


[cpp] view plaincopy

  1. var (a,b) : (Int, Float) = foo()  


其实这个改动原因是为了和元组用法相区分。


  • 在Objective-C的枚举类型导入到Swift时,已经废弃的枚举元素将不会影响可用元素的使用,这个可能需要Swift中一些枚举名称的改变。

  • 从C中导入的枚举类型都表示为RawRepresentable,这包括哪些没有被声明为NS_ENUM和NS_OPTIONS枚举值,作为这个变化的一部分,所有这些枚举类型中的value属性都需要重名为rawValue.

  • find被重名为indexOf(),sort被重名为sortInPlace()以及sorted()重名为sort().

  • String.toInt()重名为Int(String)的可失败构造器,因为构造器语法更适合类型转换。

  • String类型不再遵循SequenceType,可以使用.characters,.utf8和.utf16对应字符集的运算。

  • 在泛型函数中声明了类型参数但是在函数中没有使用时将产生一个编译时错误,例如:



[cpp] view plaincopy

  1. func foo<T>() { } // error: generic parameter ’T’ is not used in function signature   



  • 修复了Swift中泛型需求打印时“T==T”的错误。

  • 修复了跨文件协议遵循时符号不可见或者重复的错误。

  • 在Swift中增加了@objc(propertyName)属性,当该属性导入到Objective-C时可以采用这个propertyName作为getter/setter访问器的默认名,例如:



[cpp] view plaincopy

  1. class MyClass : NSObject {  

  2.  @objc(theProperty) property: String // Objective-C属性被命名为“theProperty”  

  3.  // Objective-C getter访问器被命名为“theProperty”  

  4.  // Objective-C setter访问器被命名为“setTheProperty:”  

  5. }  


  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息