xcode swift 教程7 beta发布,Swift 2.0带来哪些新变化

Xcode 7 beta发布,Swift 2.0带来哪些新变化_百度知道
Xcode 7 beta发布,Swift 2.0带来哪些新变化
我有更好的答案
网上有,感兴趣的是加了异常机制
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Xcode 7 beta发布,Swift 2.0带来哪些新变化?
发表于 13:30|
来源未来眼之老码团队|
作者王芳杰
摘要:WWDC 2015首日,苹果发布版本号为7A120f的Xcode 7 beta,继续修改Swift语法。Swift 2.0包含了许多非常重要的新特性,最新的OS X 10.11、iOS 9和watchOS 2 SDK还采纳了一些Objective-C的特性来提高Swift的编程体验。
详解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:
} while &condition&
Swift 2.0:
} 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:
单独参数语法:
- 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江湖》一书作者。
CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面,如果您有想分享的技术、观点,可通过电子邮件(tangxy#csdn.net,请把#改成@)投稿。
第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章本文为iOS UIView动画实践系列第二篇。在讲解如何使用UIKit创建最基本的视图动画后,作者以弹簧动画让UI变得鲜活起来,并将动画运用到人机交互中,让视图在用户点击操作时以动画的形式给予响应和反馈。
无论什么事物,长得好看总会更吸引目光,App同样也不例外,一款面相不错的App就算功能已经被轮子千百遍,依然会有人买账。本文是UIView Animation的第一篇,从极简的概念开始,为大家揭开Animation的神秘面纱。
Swift 2.0主要在语言基本语法、安全性和格式美观度这三方面进行了改进。除了这些新的功能特性,还有对语法的优化、修饰及美化,最后是Swift 1.x中最具影响力的错误处理机制。
苹果全球开发者大会今年的“猛料”不如往期,但Swift开源的消息,却足以赚足开发者眼球。关于苹果为什么开源Swift的分析已是铺天盖地,就无需多言,在这里更想由此思考一下语言发展的趋势及伴随的现象。
WWDC 2015首日,苹果发布版本号为7A120f的Xcode 7 beta,继续修改Swift语法。Swift 2.0包含了许多非常重要的新特性,最新的OS X 10.11、iOS 9和watchOS 2 SDK还采纳了一些Objective-C的特性来提高Swift的编程体验。
在WWDC首日演讲上,苹果非常惊喜地如开发者们所愿,将被议论了一年“是否会开源”的Swift开源了,并推出通用于全平台的开发者计划。新发布的Xcode 7 Beta中,包含了Swift 2.0和最新的OS X、iOS、watchOS SDK。
TIOBE 2015年6月编程语言排行榜发布,时隔一年后,Swift再次以骄人的成绩出现在大众眼前,本月排名第14位,并且其份额还在不断攀升中。而Objective-C则成了“自由落体”,过去几个月每月亏损约1%的市场份额。
在Swift之前,Java是最成功的编程语言,而Objective-C亦是唯一的iOS编程语言。面世一年,Swift在多个编程语言排行榜均取得不俗的成绩。尽管目前OC运用更为广泛,但未来,迅猛发展的Swift是否会让OC退出人们的视线?
Swift语言中存在着各种各样缺乏或没有文档记录的特性等着被开发者使用,尽管鲜为人知但却非常有用,本文作者对其中的一些特性进行了介绍。
CSDN移动周刊,萃取每周最精华的移动开发内容,内容涵盖最新产品、人物访谈、技术分享,每周三发送。
欢迎投稿或推荐Swift技术文章Swift 1.2带来哪些新变化?
招聘信息:
苹果前几日在面向开发者推送iOS 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升了Swift与Objective-C代码的交互性,而Swift业已更新至1.2版本。第一时间翻译了完整的Release Note。共计50多处改动,同时修改了Objective-c的语法,足见苹果对Swift语言的重视。从看出,Xcode 6.3 Beta包含了很多颇为值得开发者期待的改变,共计50多处改动,同时修改了Objective-C的语法,足见苹果对Swift语言的重视。而其代码迁移工具可以帮助开发者将其代码从Swift 1.1(Xcode 6.1)升级至Swift 1.2(Xcode 6.3),具体执行编辑菜单(Edit)->转换(Convert)-至(To)Swift1.2即可。 具体更新如下:Swift语言的增强Swift现在支持目标增量编译,例如当一个文件改变时不会重新编译Target中的每一个文件。这个基于固有依赖分析。所以你依然会看到有很多文件在必要情况下被重编。如果你发现需要重编但没有重编的情况,请报一个Bug出来。清理Target后再编,会按照往常的流程进行。增加了一个新的Set数据类型,它提供了元素唯一化,且有完整语义的通用数据类型集合。它和NSSet类型桥接,提供和Array和Dictionary相类似的功能。if let语句现在被扩展为可以支持多条条件判断:if&let&a&=&foo(),&b&=&bar()&where&a&<&b,&&
let&c&=&baz()&{&&
&}它允许你测试多种选择,并且包含一个bool判断。当然这种情况不包含嵌套判断。let常量现在生成时不需要立即初始化,新的规则是let常量必须在被首次使用前初始化即可(和var一样)。或者说它只能被初始化,也就是说在初始化后它不能再被改变或者重新赋值,可用的模式如下:let&x:&SomeThing&&
&if&condition&{&&
&x&=&foo()&&
&}&else&{&&
&x&=&bar()&&
&use(x)这个正常的来说需要var变量用法,尽管这里没有任何修改的操作。"Static"静态方法和属性现在允许在class中使用(作为“class final”的别名)。你现在可以在类中声明一个静态存储属性,它享有全局存储空间和首次使用再初始化的惰性构造功能。协议Protocal现在会声明一个static的类型要求而不是声明一个class的要求。对于表达式闭包的类型引用有了几点改进:含有单返回语句的闭包现在类型检查时以单表达式闭包处理。匿名的且含有非空返回类型的单表达式现在可以用在Void上下文中。多表达式的闭包类型的情况可能无法被类型推断出来,这归功于缺乏返回类型的情况能被正确的推断出来。Swift中的枚举类型现在可以通过@objc关键字导出到Objective-C中。@objc的枚举类型必须定义一个整型的原始类型,并且该枚举不能泛型化或者不能使用关联值。由于Objective-C中的枚举类型没有命名空间,所以导出到Objective-C中的枚举类型以枚举名字和case项目名字的组合的方式使用。 比如在Swift中的声明:@objc&&
&enum&Bear:&Int&{&&
&case&Black,&Grizzly,&Polar&&
&}导出到Objective-C:typedef&NS_ENUM(NSInteger,&Bear)&{&&
BearBlack,&BearGrizzly,&BearPolar&&
};Objective-C语言的扩展语法现在可以判断出Objective-C API中指针或者block的是否为空,同时允许不带ImplicitlyUnwrappedOptional协议地导出Objective-C API函数。Swift现在可以部分支持导入C的联合类型,包括unions、bitfileds、SIMD vector类型以及其他Swift的不支持的C特性。这些不被支持的元素不能在Swift中的直接访问,但是在Swift中,Objective-C或者C可以以参数或者返回类型的方式使用。这包括Foundation NSDecimal类型、GLKit GLKVector和GLKMatrix类型,以及其他一些类型。被导入的C结构体现在在Swift中有一个默认的构造器,它会将结构体中的所有的元素初始化为0,例如:import&Darwin&&
&var&devNullStat&=&stat()&&
&stat("/dev/null",&&devNullStat)如果一个结构体的元素不能被正确的初始化为0(比如被标记为新的_nonnull标示符时),这个默认的构造器将会终止。String的索引类型间新的转换API现在可以用了,如String、String.UnicodeScalarView、String.UTF16View以及String.UTF8View, 同时每个String View转换为String的函数也可使用。类型值在println函数或者字符串内插算法中现在可以打印完整的类型名称了:toString(Int.self)&//&打印&“Swift.Int"&&
&println([Float].self)&//&打印&"Swift.Array”&&
&println((Int,&String).self)&//&打印&"(Swift.Int,&Swift.String)"一个新的“@noescape”属性可以用在函数的闭包参数上,这意味着这个参数是唯一可被调用的(或者用在函数调用时以参数的方式出现),其意思是它的生命周期比函数调用的周期短,这有助于一些小小的性能优化,但最重要的是它屏蔽了闭包中对self.的需求。这使得函数的控制流比其他更加透明。在未来的beta版本中,标准库函数将普遍采用这种特性,比如autoreleasepool():func&autoreleasepool(@noescape&code:&()&->&())&{&&
&&&pushAutoreleasePool()&&
&&&code()&&
&&&popAutoreleasePool()&&
&}相比Swift 1.1,Swift 1.2在很多方面的性能上有本质的提高,比如多维数组算法更快,未优化的代码更加快速。表达式类型的错误诊断有了很大的提高。很多通用表达式的检查效率有很大提高,这个有助于降低编译时间和减少“expression too complex”的错误。Swift语言的改变“确保转换”和“可失败转换”的概念现在被分为两个操作符。可失败转换现在使用as!运算符,这个!感叹号可以让代码的读者更清晰的明白本次转换可能失败并触发一个运行时错误。“as”操作符会保持向上转换(比如“someDerivedValue转换为Base”)或者类型标注(“0 转换为Int8”),它保证了转换不会失败。结构体和类构造器中的let不可变属性现在被规范为更加标准的通用模型:lets类型初始化后将永不会被改变或重新赋值。以前的实现是,可以在构造器中任意修改,而现在它们只允许被初始化和提供值操作。如果一个属性在声明时已经赋值,那么它会被所有的构造器认为已经含有初始值。从桥接Objective-C类 (NSString/NSArray/NSDictionary)到它Swift中值类型的隐式转化被移除。这将是Swift的类型系统更加简单和可预测。这意味着:import&Foundation&&
func&log(s:&String)&{&println(x)&}&&
let&ns:&NSString&=&"some&NSString"&//&Okay&&
log(ns)&//&错误&&
//&"&#39;NSString&#39;&不能转换为&&#39;String&#39;"为了完成桥接转换,需要用显式转化符标注:log(ns&as&String)&//&succeeds从Swift类型到Objective-C类型的桥接隐式转换依然被允许,比如:func&nsLog(ns:&NSString)&{&println(ns)&}&&
&let&s:&String&=&“some&String”&&
&nsLog(s)&//&okay:&implicit&conversion&from&String&to&NSString&is&still&permitted@autoclosure现在标注在参数上,而不是标注在参数的类型上。比如://以前我们这样写:&&
&func&assert(predicate&:&@autoclosure&()&->&Bool)&{…&}&&
//现在需要这样写:&&
&func&assert(@autoclosure&predicate&:&()&->&Bool)&{…&}使用在函数参数上的 @autoclosure属性现在含有@noescape新属性的功能,这个改进限制了@autoclosure作为控制流程以及惰性计算的能力。柯里化函数现在可以指定参数标签了:func&curryUnnamed(a:&Int)(_&b:&Int)&{&return&a&+&b&}&&
curryUnnamed(1)(2)&&
func&curryNamed(first&a:&Int)(second&b:&Int)&->&Int&{&return&a&+&b&}&&
curryNamed(first:&1)(second:&2)Swift现在可以检测在Swift类型系统中覆盖和重写的差异以及通过Objective-C运行时可见的影响。比如,下面Objective-C类中对属性的setter和类扩展中对方法的“setProperty”它们之间的冲突现在可以被诊断:class&A&:&NSObject&{&&
&var&property:&String&=&"Hello"&//&注意:&Objective-C&方法&&#39;setProperty:’&&
&//&以前这里“属性”这里是通过setter声明&&
&extension&A&{&&
&func&setProperty(str:&String)&{&}&//&错误:方法"setProperty"&&
&//&重复声明了Objective-C方法&&
&//&#39;setProperty:&#39;&&
&}同样地检查在Objective-C中重写:class&B&:&NSObject&{&&
func&method(arg:&String)&{&}&//&注意:重写操作&&
//&这里含有类型:&#39;(String)&->&()&#39;&&
class&C&:&B&{&&
func&method(arg:&[String])&{&}&//&错误:&重写的选择器方法含有不匹配的类型&#39;([String])&->&()&#39;&&
}和协议的适配性一样:class&MyDelegate&:&NSObject,&NSURLSessionDelegate&{&&
&func&URLSession(session:&NSURLSession,&didBecomeInvalidWithError:&Bool){&}&&
&//&错误:Objective-C&方法&&#39;URLSession:didBecomeInvalidWithError:&#39;&&
&//由方法提供:&&#39;URLSession(_:didBecomeInvalidWithError:)&#39;&&
&//&和可选类型的需求方法相冲突:&&
&//&&#39;URLSession(_:didBecomeInvalidWithError:)&#39;&在协议&&
&//&&#39;NSURLSessionDelegate&#39;&&
&}Swift语言Bug修复动态转换符(“as!”, “as?“和“is”)现在可以用在Swift的协议类型上,只要该协议类型没有关联类型。在Playground增加的一致性需求现在可以按照预期工作了,比如:struct&Point&{&&
&var&x,&y:&Double&&
&extension&Point&:&Printable&{&&
&var&description:&String&{&&
&return&"(\(x),&\(y))"&&
&var&p1&=&Point(x:&1.5,&y:&2.5)&&
&println(p1)&//&prints&"(1.5,&2.5)”导入的没有文档化的NS_ENUM类型,比如UIViewAnimationCurve,现在可以通过init(rawValue:) 构造器从它的原始整型类型转换出来而不会重设为nil,为解决这个问题而用替代方法unsafeBitCast编写的代码现在可以使用原始值构造器编写了。比如:let&animationCurve&=&&
nsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue,&&
UIViewAnimationCurve.self)现在可以写为:let&animationCurve&=&UIViewAnimationCurve(rawValue:&&
userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!在枚举类型中负浮点数可以用作原始值了。指向Objective-C类,或者Swift中继承自Objective-C对象的无主引用,在该无主引用指向的对象释放后无主引用被重新赋值时不会再Crash。含有观察访问器的变量或者属性如果它可以从初始值表达式中推断出类型就无需显式指定类型。NSClassFromString函数搜索失败时其结果和nil的比较现在工作正常。子类中的重写基类含有可选类型的方法时,如果涉及到可选类型的转换将不会导致Crash。class&Base&{&&
&func&foo(x:&String)&->&String?&{&return&x&}&&
&class&Derived:&Base&{&&
&override&func&foo(x:&String?)&->&String&{&return&x!&}&&
&}关于Objective-C语言的增强Objective-C API中可以表示参数,返回值,属性,变量等等的“nullability”属性。比如,下面是表达很多UITableView API的为空特性:-(void)registerNib:(nonnull&UINib&*)nib&forCellReuseIdentifier:(nonnull&&
SString&*)&&
-(nullable&UITableViewCell&*)cellForRowAtIndexPath:(nonnull&&
SIndexPath)indexP&&
@property&(nonatomic,&readwrite,&retain,&nullable)&UIView&*backgroundV这个nullability标示符影响了Objective-C API在Swift的可选类型值,nonnull标示符标示的类型将会以非可选的类型的导入,这个用来替代隐式解封可选类型如(e.g., UINib!)。而nullable标示符标示的类型则会以可选类型导入(如UITableViewCell?),所以下面的API在Swift中表现如下:func&registerNib(nib:&UINib,&forCellReuseIdentifier&identifier:&String)&&
func&cellForRowAtIndexPath(indexPath:&NSIndexPath)&->&UITableViewCell?&&
var&backgroundView:&UIView?可空特性标示符也可以用在指针类型,包括C指针,block指针和C++成员指针,使用双下划线方式,比如:void&enumerateStrings(__nonnull&CFStringRef&(^&__nullable&callback)(void));这里,它自身的回调函数是nullable的,但是它的回调函数的返回类型为nonnull,所以这个API在Swift以如下方式使用:func&enumerateStrings(callback:&(()&->&CFString)?)总的来说,可空特性标示符有三种,可以用双下划线(用在任何指针类型),或者没有下划线的(用在Objective-C属性,方法结果类型或者方法参数类型)。特别是在Objective-C API中,很多指针倾向于nonnull,因此Objective-C提供了“audited”域(通过新的#pragma),它会认为未被标注的指针为nonnull,比如下面的例子等同于上面第一个例子,但是它用的是“audited”域来简化语句表达:#pragma&clang&assume_nonnull&begin&&
&-(void)registerNib:(UINib&*)nib&forCellReuseIdentifier:(NSString&&
&-(nullable&UITableViewCell&*)cellForRowAtIndexPath:(NSIndexPath)indexP&&
&@property&(nonatomic,&readwrite,&retain,&nullable)&UIView&*backgroundV&&
&#pragma&clang&assume_nonnull&end为了保证代码的连续性,我们强烈建议你在所有的Objective-C头文件使用“audited”域来表述其api的可空性,同时避免null_unspecified情况,建议使用在将可空性引入到现有的头文件时采用该功能作为过渡工具。Objective-C增加的nullability注解不会影响它的向后兼容性也不会影响代码的编译。比如nonnull在有些情况下依然可以以nil结束,诸如消息路由到一个为nil的接收器,但是,nullability注解只是提高Swift的编程体验,它会在Objective-C中产生一个新的警告,诸如朝一个nonnull的参数赋一个nil的话,这使得Objective-c API更加高效以及使用的正确。Objective-C可以通过null_resettable来表达属性的空属性,该属性setter访问器允许将其设置为nil(设置该属性为默认值),但是它的getter访问器不会提供一个nil值(因为它提供了默认值),有一个这样的属性如UIView’s tintColor,如果没有tint颜色指定时它会提供一个默认的tint颜色值,如:@property&(nonatomic,&retain,&null_resettable)&UIColor&*tintC这样的API在Swift使用隐式强制解封的方法使用:var&tintColor:&UIColor!C指针类型的参数或者Block指针类型可以使用noescape新属性标志,它用来标明这个指针参数不会离开这个函数或者方法而使用。这种情况下,可以安全的传递一个局部变量地址,noescape block指针在Swift中将会被映射为@noescape参数:void&executeImmediately(__attribute__((noescape))&void&(^callback)(void);将被影射到Swift为:func&executeImmediately(@noescape&callback:&()&->&Void)LLDB现在包含了一个printf()函数去计算C/C++/Objective-C表达式,这个将在arm64设备上提升表达式计算的体验,但是可能和用户在.lldbinit定义的表达式前缀冲突,如果你发现在表达式计算时出现错误,这可能就是root cause。XCode 6.3将Apple LLVM编译器更新为6.1.0,这个新的编译器版本包含了对C++14标准的全部支持,包括大量的增强的警告诊断和新的优化,对于arm64架构的支持进行了有效的重构来支持ARM的实现, 这个将明显影响矩阵内联函数计算。为arm64 vfma/vfms内联函数预定的参数被移除,虽然这个改变不会产生一个编译时错误,但是它会中断代码运行时操作,我们需要明确这个变化来减少风险。默认的,编译器现在会对使用这种内联属性提供警告并维持固有的行为,在尽可能的情况下,你需要接受这个变化并且定义USE_CORRECT_VFMA_INTRINSICS宏为1告诉编译器接收警告,当然你也可以可以USE_CORRECT_VFMA_INTRINSICS宏为0来屏蔽警告并保持固有行为。但是请不要保留这样的代码太久,因为我们计划在未来的版本中移除对这种旧行为的支持。含有自动尺寸标志的视图以及包含在UITableView、UICollectionView或NSScrollView的视图在打开文档时不会再出现对齐错误。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
点击量7581点击量6182点击量6097点击量5417点击量4783点击量4418点击量4186点击量3627点击量3416
&2015 Chukong Technologies,Inc.
京公网安备89Xcode 7 beta发布,Swift 2.0带来哪些新变化?_综合_突袭网
当前位置&:&&&& Xcode 7 beta发布,Swift 2.0带来哪些新变化?
热门标签:
Xcode 7 beta发布,Swift 2.0带来哪些新变化?
来源:本网整理
编辑:王可评论:
WWDC 2015首日,苹果发布版本号为7A120f的Xcode 7 beta,继续修改Swift语法。Swift 2.0包含了许多非常重要的新特性,最新的OS X 10.11、iOS 9和watchOS 2 SDK还采纳了一些Objective-C的特性来提高Swift的编程体验。
WWDC 2015首日,苹果发布版本号为7A120f的Xcode 7 beta,继续修改Swift语法。Swift 2.0包含了许多非常重要的新特性,最新的OS X 10.11、iOS 9和watchOS 2 SDK还采纳了一些Objective-C的特性来提高Swift的编程体验。。
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()
//当版本不匹配时返回.
你可以在你的代码声明中使用@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语句中支持代码块嵌套,例如:
//new scope
//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:
} while &condition&
Swift 2.0:
} 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:
单独参数语法:
- 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江湖》一书作者。
CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面,如果您有想分享的技术、观点,可通过电子邮件(tangxy#csdn.net,请把#改成@)投稿。
第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。
苹果发布三大新系统 “永不满足”的它四面出击
做别墅共享版Airbnb的LuxuryRetreats拿到B轮1100万美元融资
【WWDC 2015】Apple 发布 OS X 11.11 El Capitan 更新和 iOS 9,改善体验和性能,同时 Swift 开源
本网转载整理的最新文章
猎云网6月9日报道阿里巴巴集团CEO张勇今日亲自撰文就目前商业变革发表观点,他指出商业变革的奇点已经临近。他预测,“电子商务”四个字未来会消失,“商业的电子化”...
【猎云网杭州】6月8日报道(文/覃怡)听说乐奇足球要最快要在今年年底冲击新三板了,听说乐奇足球前段日子打进苹果商店体育类前十了,听说乐奇足球APP又迭代新版本了...
Laox有多国语言服务,导入最新免税处理系统,在海外游客结账时采用顺畅的直接免税处理。...
其将以本月21日的父亲节为主题,在德开大药房官网以及其天猫、京东旗舰店进行6.15到6.18促销活动。...
CF六月将会进行游戏版本的更新,这次更新将会带来全新的内容,除了有新模式和新地图.....

我要回帖

更多关于 swift 2.0 xcode 的文章

 

随机推荐