阅读更多

0顶
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结构。

详解Swift语言的改变
  • OS X 10.11、iOS 9和watchOS 2 SDK采纳了一些Objective-C的特性用来提高Swift的编程体验,如可空性、类型化集合和一些别的特性。
  • 标准库中重构了很多泛型的全局函数(如map、filter和sort),采用协议扩展方式增加这些方法。这个好处是对于其他的关联类型能很好的适配。
  • 方法和函数现在使用同样的参数命名规则了,我们可以用“_”符号来省略一个外部的参数名,为了简化使用,用来指定参数名的简化符号“#”被移除,因为Swift为默认参数提供了特殊的规则:

声明:
 func printFunction(str: String, newline: Bool)
 func printMethod(str: String, newline: Bool)
 func printFunctionOmitParameterName(str: String, _ newline: Bool)

调用:
printFunction(“hello”, newline: true)  
printMethod(“hello”, newline: true)  
printFunctionOmitParameterName("hello", true)   

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

避免采用如下位运算的调用方式:
// Swift 1.2:  
object.invokeMethodWithOptions(.OptionA | .OptionB)  
object.invokeMethodWithOptions(nil)  
if options & .OptionC == .OptionC {  
 // .OptionC被设置  
}  

选项设置支持字面量语法和set样式的调用,如contains:
object.invokeMethodWithOptions([.OptionA, .OptionB])  
object.invokeMethodWithOptions([])  
if options.contains(.OptionC) {  
 // .OptionC is set  
}  

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

struct MyOptions: OptionSetType {  
 let rawValue: Int  
 static let TuringMachine = MyOptions(rawValue: 1)  
 static let LambdaCalculus = MyOptions(rawValue: 2)  
 static let VonNeumann = MyOptions(rawValue: 4)  
}  
let churchTuring: MyOptions = [.TuringMachine, .LambdaCalculus]   

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

Swift 1.2:
do {  
...  
} while <condition>  

Swift 2.0:
repeat {  
...  
} while <condition>   

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

Swift 1.2:
func print(<stuff to print>)  
func println(<stuff to print>)  

Swift 2.0:
func print(<stuff to print>, appendNewline: Bool = true)  

Swift的文档注释现在基于Markdown语法。
参数纵览语法:
- Parameters:  
 - x: ...  
 - y: ...  

单独参数语法:
- parameter x: ...  
- parameter y: ..  

返回值:
- returns: ...  

其他需要在QuickHelp中高亮的语法字段,可以参考Markdown语法。
  • CFunctionPointer<T -> U> 类型被移除,C函数现在使用新的@convention(c)属性声明,和其他函数类型一样,@convention(c) T->U是一个非空的除非是它是可选的。@objc_block属性由@convention(block)取代。
  • 类型标注不能用于模式匹配,而需要作为标注声明的一部分:

这意味着,以前的这样的写法:
var (a : Int, b : Float) = foo()  

需要被重构为:
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对应字符集的运算。
  • 在泛型函数中声明了类型参数但是在函数中没有使用时将产生一个编译时错误,例如:

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

  • 修复了Swift中泛型需求打印时“T==T”的错误。
  • 修复了跨文件协议遵循时符号不可见或者重复的错误。
  • 在Swift中增加了@objc(propertyName)属性,当该属性导入到Objective-C时可以采用这个propertyName作为getter/setter访问器的默认名,例如:

class MyClass : NSObject {  
 @objc(theProperty) property: String // Objective-C属性被命名为“theProperty”  
 // Objective-C getter访问器被命名为“theProperty”  
 // Objective-C setter访问器被命名为“setTheProperty:”  
}  

作者简介:

王芳杰 老码团队(@未来眼之老码团队)成员,目前就职于叠拓信息技术有限公司,担任叠拓NGN中国人力资源培养经理、叠拓NGN中国售前经理,《老码说编程之玩转Swift江湖》一书作者。
  • 大小: 10.2 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • CustomGenericViewFromXib:Swift 2.0 XCode 7 Beta 6

    CustomGenericViewFromXib

  • WatchOS2_Complication:使用ClockKit框架以Apple WatchOS 2 beta的Swift 2.0编写的模块化大型并发症模板

    使用ClockKit框架以Apple WatchOS 2 beta的swift 2.0编写的并发症示例是Apple WatchOS 2中新发布的并发症 在我的示例中,我选择使用名为CLKComplicationTemplateModularLargeStandardBody的模板 您可以在查看其他21...

  • SwiftUI 2.0:开发者热切盼望的版本带来了哪些新功能?

    全文共2274字,预计学习时长14分钟 图源:unsplash ...很多人翘首以盼的SwiftUI 2.0在WWDC 2020中...你需要一个Xcode 12 beta(最低要求macOS版本为10.15.4)来运行新的SwiftUI控件。让我们开始吧! 新的...

  • swiftui_SwiftUI 2.0的新功能?

    swiftuiWWDC 2020 commences this week, and the developer community was eagerly looking forward to SwiftUI 2.0. Unsurprisingly, Apple dropped some brand new API updates for SwiftUI at the end of Keynote...

  • iOS项目更新之升级Xcode7 & iOS9 & swift2.0

    1 sizeWithAttributes ...3 Xcode 7 beta发布,Swift 2.0带来哪些新变化? http://www.csdn.net/article/2015-06-09/2824909-xcode-7-beta-and-swift/2 4 Check for internet conncetion in Swift 2 (iOS 9) ...

  • Swift 2.0 中使用 try? 关键字

    Xcode 7 Beta 6 发布时,我一下子就被下面这三个特性迷住了:还有一件事我没有发到推特上:我对 Swift 最大的改动——try?关键字——很不理解。Swift 新增一个关键字try?。try?会试图执行一个可能会抛出异常的操作。...

  • 在SwiftUI 2.0和Xcode 12中使用CoreData

    由donnywals于2020年7月20日发布 在Xcode 12中,您可以创建不再使用AppDelegate和SceneDelegate来管理应用程序生命周期的项目,通常我们在AppDelegate中集成Core Data,相关步骤可以参考《iOS开发从入门到精通》课程...

  • Xcode 7 Beta1 官方下载

    在刚刚结束的苹果开发者大会,苹果推出了全新的OS X 10.11和iOS 9操作系统(iOS 9 Beta 1下载),届时XCode 7 也出了第一个Beta版本,主要是对新的操作系统支持外,还更新了Swift为2.0版本。Xcode 7 beta 第一个版本...

  • swift c语言数组,在 Swift 2.0 当中使用 C 语言回调

    作者:Ole Begemann,原文链接,原文日期:2015-06-22译者:小锅;...2015-07-01针对 Xcode 7 beta 2 更新从 CGPathElement 创建一个 PathElement 类型的代码。几年前,我曾经写过一篇关于如何获取 ...

  • 如何快速将Swift2.0的项目过渡到Swift3.0

    今年WWDC之后,相信大家都已经更新到iOS10和Xcode8.0beta版本尝鲜了,其中包括SiriKit、新的语音识别框架SFSpeechRecognizer、通知框架(UserNotifications.framework、UserNotificationsUI.framework)等等都等待着...

  • Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】

    Swift_3.0 相对于 Swift_2.2 版本发生了哪些的变化。本文件将以最直观的代码对比以及文字分析阐述。

  • 如何将Swift数组转换为字符串?

    #4楼 Swift 2.0 Xcode 7.0 beta 6 onwards uses joinWithSeparator() instead of join() : Swift 2.0 Xcode 7.0 beta 6及更高版本使用joinWithSeparator()而不是join() : var array = ["1", "2", "3"] let ...

  • Xcode 7.0 beta中OC的语法更新

    Apple在2015WWDC上,发布了新一代的iOS 9,Mac OS EI Caption,Watch OS,同时,也发布了最新的IDE,Xcode7.0 beta,该版本可以随意的吓到在官网上,同时,也可以在一些网盘中找到。 Xcode的此次更新,在OC和Swift...

  • Xcode7 beta4 相关问题

    由于感觉swift1.2在与C语言的指针转换上有很多不方便,不如swift2.0做的完善,于是使用xcode7 beta4.在使用过程中遇到很多问题,再次列出以便以后查看。 xcode7 beta4第一个bug就是无法使用iPhone虚拟机了,报错如下...

  • Xcode7新功能

    重要:这只是开发中API或技术的一...本文档的新版本可能用来作为未来API或技术的beta版。 Xcode是一个完整的开发工具,用于在苹果手表,ipad,iPhone和Mac创建应用程序。Xcode开发工具包涵分析工具、模拟器以及watchO

  • swift2.0 AVAudioRecorder的使用

    以下仅仅是部分笔记,环境xcode7 beta6 let recordUrl:NSURL! = NSURL.fileURLWithPath(NSTemporaryDirectory().stringByAppendingString("record.lpcm"))  let recordSetting = [AVFormatIDKey:...

  • Swift2.0之guard语句

    Swift的Guard语句 字数1271 阅读2430 评论3 喜欢10 本篇文章翻译自: ...原作者:ecerney ...*译者注:该语法为swift2.0新特性,目前(2015-07-30)仅xcode 7 beta支持,xcode6并不支持。最开始在Apple的Pla

  • swift反射──Mirror(swift 2.0)

    swift2.0 反射

  • tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl

    tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl

Global site tag (gtag.js) - Google Analytics