Swift 3.0的新增功能以及您为什么要关心
自Apple的Swift于2015年12月开源以来,来自世界各地的开发人员一直在要求该公司引入其核心功能的变化。 在考虑了提议之后,Swift 3.0的beta版本终于在本月发布,它带来了许多值得一试的功能。
该版本的主要目标是丰富Swift语言并增强开发经验。
从大量改进工具质量到对API进行大规模修改以及为改善Objective-C API的自动命名指南,Swift 3.0为程序员提供了很多存储空间。
在列出这些功能之前,让我们简要介绍一下什么是Swift及其如何演变。
什么是Swift?
Swift是一种针对iOS,OS X,watchOS和tvOS应用程序的编程语言,它基于C和Objective-C的最佳组合而构建,不受C兼容性的限制。 Swift采用安全的编程模式,并添加了现代功能,使编程更加轻松,灵活和有趣。
Swift对Objective-C开发人员感到熟悉。 它采用了Objective-C命名参数的可读性以及Objective-C动态对象模型的强大功能。 它提供对现有Cocoa框架的无缝访问,以及与Objective-C代码的混合匹配互操作性。 它是第一种与脚本语言一样表现力和令人愉悦的工业级系统编程语言。 它支持游乐场,这是一项创新功能,使程序员可以试验Swift代码并立即查看结果,而无需构建和运行应用程序。
修订记录:
每个版本的Swift的一些主要亮点:
2016年3月21日:Swift 2.2
–删除了有关C样式for循环,++前缀和后缀运算符以及—前缀和后缀运算符的讨论。
–在“选择器表达式”部分中添加了有关Objective-C选择器的#selector语法的信息。
–在“构建配置语句”部分中添加了有关如何根据所使用的Swift版本有条件地编译代码的信息。
2015年10月20日:Swift 2.1
–更新了“通过可选链接访问属性”部分,以阐明通过可选链接进行分配的行为。
–更新了“字符串插值”和“字符串文字”部分,因为字符串插值可以包含字符串文字。
2015年9月16日:Swift 2.0
–添加了有关新尝试的信息? 将错误转换为可选值部分的关键字。
–将有关API可用性检查的信息添加到“控制流”一章的“检查API可用性”部分和“语句”一章的“可用性条件”部分。
–更新了“同时重复”部分,其中包含有关“同时重复”循环的信息。
–使用有关标记的中断语句的信息更新了“中断语句”部分。
2015年4月8日:Swift 1.2
– Swift现在具有本机Set集合类型。
–在运行时可能失败的类型转换现在使用as? 还是一样! 运算符,并使用as运算符来保证不会失败的类型转换。
–更新了协议声明以阐明协议声明的范围和成员。
2014年10月16日:mSwift 1.1
– Any类型的常量和变量现在可以包含函数实例。 更新了Any的示例,以显示如何在switch语句中检查并强制转换为函数类型。
–现在,具有原始值的枚举具有rawValue属性而不是toRaw()方法,并且具有rawValue参数而不是fromRaw()方法的失败的初始化器。
2014年8月18日:Swift 1.0
–添加了有关仅类协议的新部分。
–在“声明属性”部分中添加了有关可用性属性的信息。
–可选参数不再具有值时隐式评估为true,而没有赋值时则隐式评估为false,以避免在使用可选Bool值时产生混淆。 而是使用==或!=运算符对nil进行显式检查,以找出可选值是否包含值。
– Swift现在有一个Nil合并运算符(a ?? b),如果存在可选的值,它将解开包装;如果可选的值为nil,则返回默认值。
–更新了“访问和修改数组”部分,以注意您不能再使用+ =运算符将单个项目附加到数组。 相反,请使用append(_ :)方法,或使用+ =运算符附加单项数组。
这就是Swift 3.0的新功能。
API变更
Swift 3中最大的更新涉及标准库,该标准库在各个库之间采用一致的命名约定。 API设计指南包含了团队在构建Swift 3时确定的规则,这些规则对新程序员的可读性和可访问性具有很高的重视。 核心团队奉行的原则是:“良好的API设计始终考虑调用站点”。 他们力求使使用点更加清晰。 事不宜迟,以下是最有可能影响您的更改。
第一个参数标签
现在,除非另有要求,否则函数和方法中的第一个参数始终带有标签。
例如:-
“ RW” .writeToFile(“文件名”,原子:true,编码:NSUTF8StringEncoding)// Swift 2.2
“ RW” .write(toFile:“文件名”,原子上:true,编码:NSUTF8StringEncoding)// Swift 3.0
覆盖func numberOfSectionsInTableView(tableView:UITableView)-> Int
重写func numberOfSections(在tableView中:UITableView)-> Int
如果该方法调用在没有介词的情况下也能很好地读取并且不需要标签,则应使用下划线明确排除第一个参数名称:
例如:-覆盖func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {…}
覆盖func didMoveToView(_ view:SKView){…}
这些是优化可读性的工作的一部分。
省略不必要的词
在Apple库的先前迭代中,方法包括一个指示其返回值的名称。 由于Swift编译器会进行类型检查,因此这几乎没有必要。 该小组认真研究了如何滤除所有噪声,以便仅保留信号,从而消除了许多重复单词。
关于如何将Objective-C库转换为原生Swift的API变得更加聪明
例如:-//旧方法,Swift 2,然后是新方法,Swift 3
让蓝色= UIColor.blueColor()
让蓝色= UIColor.blue()
设min = numbers.minElement()
设min = numbers.min()
attributedString.appendAttributedString(anotherString)
attributedString.append(anotherString)
names.insert(“简”,atIndex:0)
names.insert(“简”,在:0)
UIDevice.currentDevice()
UIDevice.current()
现代化的GCD和核心图形
说到旧的API保留,GCD和Core Graphics都收到了急需的改造.Grand Central Dispatch用于许多线程任务,例如长计算或与服务器通信。 通过将活动移至其他线程,可以防止锁定用户界面。 libdispatch库是用C编程语言编写的,并且始终使用C风格的API。 该API现在已在本机Swift中重新定义。
例如:-//旧方法,Swift 2
让队列= dispatch_queue_create(“ com.test.myqueue”,无)
dispatch_async(queue){
打印(“ Hello World”)
}
//新方法,Swift 3
let queue = DispatchQueue(标签:“ com.test.myqueue”)
queue.async {
打印(“ Hello World”)
}
同样,Core Graphics是用C编写的,过去使用了笨拙的函数调用。 这是新方法的外观
例如:-//旧方法,Swift 2
让ctx = UIGraphicsGetCurrentContext()
让矩形= CGRect(x:0,y:0,宽度:512,高度:512)
CGContextSetFillColorWithColor(ctx,UIColor.blueColor()。CGColor)
CGContextSetStrokeColorWithColor(ctx,UIColor.whiteColor()。CGColor)
CGContextSetLineWidth(ctx,10)
CGContextAddRect(ctx,矩形)
CGContextDrawPath(ctx,.FillStroke)
UIGraphicsEndImageContext()
//新方法,Swift 3
如果让ctx = UIGraphicsGetCurrentContext(){
让矩形= CGRect(x:0,y:0,宽度:512,高度:512)
ctx.setFillColor(UIColor.blue()。cgColor)
ctx.setStrokeColor(UIColor.white()。cgColor)
ctx.setLineWidth(10)
ctx.addRect(矩形)
ctx.drawPath(使用:.fillStroke)
UIGraphicsEndImageContext()
}
枚举案例的大写
与您习惯于对Swift进行编码的方式相反,lowerCamelCase现在取代了枚举的情况。 这使它们与其他属性或值更加一致
例如:-//旧方法,Swift 2,然后是新方法,Swift 3
UIInterfaceOrientationMask.Landscape
UIInterfaceOrientationMask.landscape
NSTextAlignment.Right
NSTextAlignment.right
SKBlendMode.Multiply
SKBlendMode.multiply
UpperCamelCase现在仅保留用于类型和协议的名称。 尽管这可能需要一些时间来适应,但是Swift团队在争取一致性方面确实有很好的理由。
功能类型
函数声明和函数调用的参数始终带有括号:
例如:-func f(a:Int){…}
f(5)
但是,当您将函数类型用作参数本身时,您可能会这样写:
func g(a:Int-> Int)-> Int-> Int {…} //旧方法,Swift 2
您可能会注意到它很难阅读。 参数在哪里结束,返回类型从哪里开始? 使用Swift 3定义此功能的正确方法是:
func g(a:(Int)-> Int)->(Int)-> Int {…} //新方法,Swift 3
现在,参数列表用括号括起来,然后是返回类型。 事情更加清晰,因此,函数类型更易于识别。 这是一个更可靠的比较:
例如:-//旧方法,Swift 2
整数->浮动
字符串->整数
T-> U
整数->浮动->字符串
//新方法,Swift 3
(整数)->浮动
(字符串)->整数
(T)-> U
(整数)->(浮点数)->字符串
API附加
访问包含类型
定义静态属性或方法时,总是直接在类型上调用它们:
CustomStruct.staticMethod()
如果要在类型的上下文中编写代码,则仍需要包括该类型的名称以在该类型上调用静态方法。 为了使它更简洁,您现在可以调用Self来获取包含的类型。 大写字母“ S”是指自我的类型,而小写字母“ s”是指自我的实例
运作方式如下
struct CustomStruct {
静态函数staticMethod(){…}
func instanceMethod(){
Self.staticMethod()//在类型的正文中
}
}
让customStruct = CustomStruct()
customStruct.Self.staticMethod()//类型实例
内联序列
sequence(first:next :)和sequence(state:next :)是返回无限序列的全局函数。 您给他们一个初始值或可变状态,他们就会懒洋洋地套用闭包
例如:-用于按顺序查看(第一个:someView,下一个:{$ 0.superview}){
// someView,someView.superview,someView.superview.superview…
}
您可以使用前缀操纵器来约束序列:
例如:-对于x顺序(第一个:0.1,下一个:{$ 0 * 2})。前缀(而:{$ 0 <4}){
// 0.1、0.2、0.4、0.8、1.6、3.2
}
杂项和目的
•#keyPath()与#selector()类似,可帮助您消除字符串型API中的错别字
•现在,以您打算使用的类型调用pi:Float.pi,CGFloat.pi。 而且在大多数情况下,编译器可以推断类型:let圆周= 2 * .pi *半径
•在旧的基础类型上已删除了NS前缀,现在可以使用Calendar,Date代替NSCalendar和NSDate。
加起来
Apple在发布Swift 3.0 Beta版时的重点是正确掌握基础知识。 目前尚不确定在Swift 3.0的beta版本之后是否可能进行进一步的更改。 这个新版本旨在提供最终的开发经验,可以被视为程序员的福音。