说说swift3.0 那些事

前段时间搞了一段时间的swift(swift3.0以前的版本),各种基础控件和知识点的样例demo已完成,还没有来得及喘口气,swift3.0来了,于是就直接用最新的版本来跑了一下工程,build一下立马吓晕了,好几十个错误,这是什么鬼?swift3.0改变这么多吗?虽然可以设置兼容版本,但是swift3.0是最新版,也是以后必须要使用的最低版本(说不定还有swift4.0,swift5.0,谁知道呢),所以我放弃了兼容性的设置,还是直接用swift3.0,于是一个类文件一个类文件的去改,修改中发现虽然语法什么的改变了很多,但是客观来说,这个改变确实是越来越好,越来越规范,越来越简洁。下面就swift3.0的新特性来简单说一下。

一、基础语法知识改动

1.  去除了oc中常用的++、-- 运算符操作,当然还是可以通过+=、-= 来实现相应的功能。

2.  之前使用的for循环格式 for var i = 0;i<100;i++{ //code here  }已被遗弃,取而代之的是 for i in 1...100{//code here }、(1...10).forEach {//code here}

3. 所有的函数参数都有带上形参标签,3.0之前的版本一般是从第二个参数开始才带参数标签,3.0以后第一个也要加上形参标签,这个感觉有点增加工作量,其实从安全角度考虑还是值得的。

let sum = add(a: 2, b: 10)

func add(a:Int, b:Int) -> Int{

return a + b

}

4. 移除了 NS 前缀,替换为下面的展示形式

let file = Bundle.main.path(forResource: "demo", ofType: "json")

let url = URL(fileURLWithPath: file!)

let data = try! Data(contentsOf: url)

let json = try! JSONSerialization.jsonObject(with: data)

print(json)

5.数组排序函数的改变,过去数组排序的两个方法:sortInPlace() 和 sort(),现在分别改名成 sort() 和 sorted()

sort() 是直接对目标数组进行排序。sorted() 是返回一个排序后的数组,原数组不变。

var array1 = [1, 5, 3, 2, 4]

array1.sort()

print(array1)  //[1, 2, 3, 4, 5]

var array2 = [1, 5, 3, 2, 4]

let sortedArray = array2.sorted()

print(array2)  //[1, 5, 3, 2, 4]

print(sortedArray)  //[1, 2, 3, 4, 5]

6. 数组的反转和遍历的改变,过去 reverse() 方法实现数组反转,enumerate() 方法实现遍历。现这两个方法都加上 ed 后缀(reversed、enumerated)

for i in (1...100).reversed() {

print(i)

}

let array = [1, 5, 3, 2, 4]

for (index, value) in array.enumerated() {

print("\(index + 1) \(value)")

}

7. 枚举成员变成小写字母开头

Swift 3.0 将枚举成员当做属性来看,所以现在使用小写字母开头而不是以前的大写字母,这种写法更符合驼峰式的编写规范。

.system //过去是:.System

.touchUpInside //过去是:.TouchUpInside

.fillStroke //过去是:.FillStroke

.cgColor //过去是:.CGColor

二、UI层面的改动(简要的举例一下,更多的自己在工程中体验,都有提示输出的)

swift3.0在UI的层面改动了不少,不过相对之前的版本来说,这个改动更加简洁,更加符合使用习惯。

1. 移除了多余的API词语,而且将之前的大写开头的(比如.Normal)改了了小写形式(.normal)更加符合我们以往oc的规范和习惯。

UIApplication .sharedApplicaton 改为UIApplication .shared

NSTextAlignmentCenter改为NSTextAlignment.center

UIColor.blueColor() 改为 UIColor.blue

button.setTitle(forState) 改为 button.setTitle(for)

button.addTarget(action, forControlEvents) 改为 button.addTarget(action, for)

arr.minElement() 改为 arr.min()

arr.maxElement() 改为 arr.max()

attributedString.appendAttributedString(anotherString) 改为 attributedString.append(anotherString)

names.insert("Jane", atIndex: 0) 改为 names.insert("Jane", at: 0)

NSBundle.mainBundle() 改为 Bundle.main

UIDevice.currentDevice() 改为 UIDevice.current

NSData(contentsOfURL) 改为 Data(contentsOf)

NSJSONSerialization.JSONObjectWithData() 改为 JSONSerialization.jsonObject(with)


2. 取消了CGRectMake(0,0,100,100)方法,用CGRect(x:0 ,y:0,width:100,height:100)替换,取消了CGPointMake(0, 0),用CGPoint(x: 0, y: 0)替换,取消了CGSizeMake(20, 20),用CGSize(width: 20, height: 20)替换

3.特别要提醒的是函数的方法名(无参和有参)

之前对按钮添加事件的时候可以直接用字符串来作为函数的方法名,例如,backBtn.addTarget(self, action: “backAction”, forUIControlEvents: .touchUpInside),3.0以后就取消了这种定义方式,而是改成了#selector的方式,backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside),上面说的是对于没有参数的方法而言,对于带有参数的方法,这里就要注意了,之前对按钮添加有参的事件方法可以是backBtn.addTarget(self, action: “backAction:”, forUIControlEvents: .touchUpInside)或backBtn.addTarget(self, action: #selector(backAction:), forUIControlEvents: .touchUpInside),3.0以后这两个方式都被取消了,而是用backBtn.addTarget(self, action: #selector(backAction(_:)), for: UIControlEvents.touchUpInside)

如果是对于手势操作,函数中的参数定义要和实现中的保持一致

//长按监听

let longPress=UILongPressGestureRecognizer(target:self,

action:#selector(longPressDid(sender:)))

self.view.addGestureRecognizer(longPress)

//长按手势,

func longPressDid(sender: UILongPressGestureRecognizer){

if sender.state == .began {

print("长按响应开始")

} else {

print("长按响应结束")

}

}

开关控件和日期控件的选择事件的命名同上。


三、GCD方面的改变

GCD方面的语法形式改动的也不小,之前的版本和OC的风格还是比较相近的,但是swift3.0中变化很大,dispatch 的全局函数不再写为下划线风格的名称了,它变成了一个更符合 Swift 风格的 DispatchQueue 。

1.主线程

过去是通过 dispatch_get_main_queue ( ) 来获取主线程,现在是用 DispatchQueue .main,只需要在线程后边使用.async{ } 即可,

DispatchQueue.main.async {

//code here 

}

2.优先级 名称

过去GCD 的默认队列优先级有四个:

• DISPATCH_QUEUE_PRIORITY_HIGH

• DISPATCH_QUEUE_PRIORITY_DEFAULT

• DISPATCH_QUEUE_PRIORITY_LOW

• DISPATCH_QUEUE_PRIORITY_BACKGROUND

swift3.0 中,这四个优先级的名字更加简洁易懂:

• .userInitialted (对应之前的DISPATCH_QUEUE_PRIORITY_HIGH)

• .default(对应之前的DISPATCH_QUEUE_PRIORITY_DEFAULT)

• .utility(对应之前的DISPATCH_QUEUE_PRIORITY_LOW)

• .background(对应之前的DISPATCH_QUEUE_PRIORITY_BACKGROUND)

3. 获取一个队列

swift3.0使用 DispatchQueue.global ( ) 获取一个系统的队列(系统自带的全局并发队列),这样的话获取的就是默认 .default优先级的队列了,如果要获取其他优先级的队列,就使用DispatchQueue.global(qos:.userInitiated),最后,我们使用 . async{} 来执行代码:

DispatchQueue.global(qos: .userInitiated).async {

   //code here

}


4. 创建一个队列

直接用 DispatchQueue 的初始化器来创建一个队列。最简单直接的办法是这样:

let queue = DispatchQueue(label: "myBackgroundQueue"){ 

//code here 

}

你可以指定优先级以及队列类别:

let queue = DispatchQueue(label: "myBackgroundQueue", qos: .userInitiated, attributes: .concurrent)

{

//code here

}



5. 队列组 

对于组,可以使用这样的语法直接创建一个组:

let group = DispatchGroup()

至于使用,则是这样的:

let group = DispatchGroup()

let queue = DispatchQueue(label: "myBackgroundQueue")

queue.async(group:group) {

print("background working")

}

那么,如果有多个并发队列在同一个组里,我们需要它们完成了再继续呢?

group.wait()


6. 指定时间后执行操作

这个大家知道在swift3.0之前实现这个功能还是比较繁琐的,特别是哪些系统宏的使用,但是swift3.0以后,这个实现就变的非常简单了,只需如下代码即可。

//下面的x就是你想延迟执行的秒数

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + x) {

 //code here 

}

swift3.0的变动还有很多细节方面的,这里就不一一陈述了,具体的变化还是要在实际使用时才能更好的体会到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,322评论 5 465
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,288评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,227评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,015评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,936评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,534评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,995评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,616评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,907评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,923评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,741评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,525评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,016评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,141评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,453评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,054评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,249评论 2 339

推荐阅读更多精彩内容

  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 598评论 0 0
  • 之前 Apple 在 WWDC 上已将 Swift 3 整合进了 Xcode 8 beta 中,而本月苹果发布了 ...
    宋进锋阅读 308评论 0 0
  • 学习多线程,转载两篇大神的帖子,留着以后回顾!第一篇:关于iOS多线程,你看我就够了 第二篇:GCD使用经验与技巧...
    John_LS阅读 601评论 0 3
  • GCD(Grand Central Dispatch) 介绍 GCD 属于系统级的线程管理,在 Dispatch ...
    fuyoufang阅读 4,605评论 0 10
  • 《后会无期》 文/白传英 我一个人在这里 这里只有回忆 不知道你去了哪里 再也发现不了你的信息 月亮没有...
    白清风阅读 260评论 0 1