经历了从swift 1.0 到2.0,一个版本之后代码居然就不兼容了。这如何在团队推广呢?没有想到3.0居然变化更加的大。有多大,来体会一下:

UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
UIFont.preferredFont(forTextStyle: UIFontTextStyleSubheadline) override func numberOfSectionsInTableView(tableView: UITableView) -> Int
override func numberOfSections(in tableView: UITableView) -> Int

在swift 2.x的时代基本上ObjC的接口是什么样的,那么swift的方法名称也是一样的。

在swift发布的时候,其实很多人都发现其语法有很多脚本语言的特征。但是方法名称还是保留着ObjC的“见名知义”的特征,那叫一个长,把这个方法的功能里里外外都说明的非常清楚。但是,其实这些没有完全的必要。所以在swift 3.0里使用方法里参数的lable来完成说明方法功能的作用。

去掉多余文字

所谓“去掉多余文字”就是把原来iOS SDK方法名称里的描述性文字都移到方法的label里面。并且原来方法第一个参数的label可以不写的,现在所有label在调用的时候都需要给出,除非特殊说明。这样的修改就大大的说短了方法名。

attributedString.appendAttributedString(anotherString)
attributedString.append(anotherString) names.insert("Jane", atIndex: 0)
names.insert("Jane", at: 0) UIDevice.currentDevice()
UIDevice.current()

第一个参数的label

如上所述,方法的第一个参数的label在swift2.x版本里调用的时候是不用写的,但是在3.0版本必须给出。

NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true)
NSTimer.scheduledTimer(timeInterval: 0.35, target: self, selector: #selector(reset), userInfo: nil, repeats: true)

如果说你在自己定义的方法在调用的时候不需要label,那么需要显式的用下划线“_”表明。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }
override func didMoveToView(_ view: SKView) { ... }

对SDK里C的改造

这是千呼万唤始出来的修改。之前对于c接口的调用基本上保持了和ObjC调用一致的风格:

let ctx = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512)
CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor)
CGContextSetStrokeColorWithColor(ctx, UIColor.whiteColor().CGColor)
CGContextSetLineWidth(ctx, 10)
CGContextAddRect(ctx, rectangle)
CGContextDrawPath(ctx, .FillStroke)
UIGraphicsEndImageContext()

在swift3.0中也改造成了swift风格的API:

if let ctx = UIGraphicsGetCurrentContext() {
let rectangle = CGRect(x: 0, y: 0, width: 512, height: 512)
ctx.setFillColor(UIColor.blue().cgColor)
ctx.setStrokeColor(UIColor.white().cgColor)
ctx.setLineWidth(10)
ctx.addRect(rectangle)
ctx.drawPath(using: .fillStroke) UIGraphicsEndImageContext()
}

还有GCD部分的API也已经改造。GCD是完全用C写的一个叫做libdispatch的库。在swfit3.0中是这样的:

let queue = DispatchQueue(label: "com.test.myqueue")
queue.async {
print("Hello World")
}

与之前的调用方式差别很大,之前是这样的:

let queue = dispatch_queue_create("com.test.myqueue", nil)
dispatch_async(queue) {
print("Hello World")
}

方法类型

在一个方法可以接受另外一个方法作为参数传入的时候,这个方法的定义在swift2.0里是这样的:

func g(a: Int -> Int) -> Int -> Int  { ... }

a: Int -> Inta是一个接受一个Int参数,返回一个Int值的方法的定义。在swift3.0里是这样定义的:

func g(a: (Int) -> Int) -> (Int) -> Int  { ... }

更加易读。至少能看出来接受一个Int型参数了。

最后

以上是一些经常会接触到的改变。其他的改变还有性能的提升,和编译后APP提及的缩减。这些不是一眼能看见的改变也是非常的巨大的。但是,更加有魅力也更加实用的改变是Swift Package Manager有了这个工具就可以直接像js的npm,python的pip一样,一个命令搞定全部包和包的依赖项。顿时感觉天空一片晴朗有木有!

另外还有很重要的一点。swift已经发展到一定的程度,语言本身已经基本定型。所以从这个版本开始swift社区把代码的兼容放在一个比较靠前的位置来考虑了。至少按照官方的说法是不到万不得已不破坏代码的向前兼容(最前也就到swift3.0了)。可以考虑在在团队中引入swift了。

Swift3翻天覆地的改变的更多相关文章

  1. swift3.0的改变

    Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github ...

  2. 1-3 - C#语言习惯 - 推荐使用查询语法而不是循环

    C#语言中并不缺少控制程序流程的结构,for.while.do-while和foreach等都可以做到这点. 历史上所有计算机语言设计者都不曾遗漏这些重要的循环控制结构. 不过我们还有一个更好的方式: ...

  3. GCD in Swfit 3.0

    这里包括了Queue, Group, Barrier, Semaphore等内容.基本上常用的GCD对象和方法在Swift3.0的改变都囊括其中. 代码在这里:https://github.com/f ...

  4. V&View更新

    这几天一直在做V&View的更新工作,这次的更新是质的变化,表面界面变化不大,可是内部确有着翻天覆地的改变. 这几天我主要做了一下几件事: 1. 重新构思了vview的文章发布形式,之前使用k ...

  5. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

  6. 【转】【2015MIIC】迅雷CTO陈磊:互联网思维会害死很多传统企业

    MIIC2015大会的“跨界与重构”论坛上,迅雷CTO.网心科技CEO陈磊的演讲引起众多共鸣——独家揭秘“互联网大忽悠”,给这群人画了像,互联网大忽悠通常有五招: 第1招,画大饼,给你一个宏伟的目标: ...

  7. HR从业者的下一个十年该怎么做?

    众所周知,目前我们所处的以互联网为代表的新经济时代,有两个重要的特征一是客户价值至上,二是人力资本主权.围绕这两个基本特征,我们需要重新架构我们的商业模式和创新人力资源管理思维.模式.工具和方法. 人 ...

  8. 零售业山重水复,全景行柳暗花明——VR全景智慧城市

    对今天的中国来说,寻找经济转型的突破口,寻找经济权力的新霸主,零售业应该当仁不让. 零售业正在经历一场脱胎换骨的改造.一方面零售额达到前所未有的水平,另一方面,传统零售商也面临诸多挑战,其中之一,便是 ...

  9. VR全景,零售业冬天里的一把火——全景智慧城市

    对今天的中国来说,寻找经济转型的突破口,寻找经济权力的新霸主,零售业应该当仁不让. 零售业正在经历一场脱胎换骨的改造.一方面零售额达到前所未有的水平,另一方面,传统零售商也面临诸多挑战,其中之一,便是 ...

随机推荐

  1. jQuery 实例

    选择器 $(this).hide() 隐藏当前的 HTML 元素. $("p").hide() 隐藏所有 <p> 元素. $(".test").hi ...

  2. Python ctypes.windll.user32() Examples

    Example 1 Project: OSPTF   Author: xSploited   File: mouselogger.py View Source Project 7 votes def ...

  3. phpstorm的安装和使用

    1下载phpstorm #下载地址 https://www.jetbrains.com/phpstorm/ 2激活并安装 create associations 表示的是以后编辑选择的文件也默认用id ...

  4. IntelliJ idea 的破解

    ·1.破解的jar包下载链接: https://pan.baidu.com/s/1JV6GwguGQNs5pNQtst29Hw  提取码: u2jd 2.安装和破解地址:https://www.cnb ...

  5. 代码UITableView点击cell跳转

    首先,在tableViewController中设置好 代理和数据源方法: @interface FirstTableViewController ()<UITableViewDataSourc ...

  6. js Array 方法总结

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. php实现MySQL两库对比升级版

    define('DATABASE1', 'db1'); $dbi1 = new DbMysql; $dbi1->dbh = 'mysql://root:password@127.0.0.1/'. ...

  8. inet_pton和inet_ntop inet_ntoa

    Linux下地址转换函数 inet_pton ==> Ox inet_ntop ==> xxx.xxx.xxx #include <sys/types.h> #include ...

  9. AOP 和 前置通知,后置通知

    Spring 1.AOP:中文名称面向切面编程 2.英文名称:(Aspect Oriented Programming) 3.正常程序执行流程都是纵向执行流程 3.1 又叫面向切面编程,在原有纵向执行 ...

  10. socketserver模块实现并发和连接合法性验证

    一.socketserver模块 1.sockeserver的源码流程 2.简单的使用 socketserver服务端 import socketserver class MyServer(socke ...