Swift3.0中的新改变

前言

在WWDC2016中Swift3.0发布,在大会中官方也提到了很多关于Swift的新改变和突破,接下来我们来了解一下一些新改变.

本章主要是了解一些在实际开发中需要用到的方法或者函数,我使用的是Xcode8测试版, 在测试版中有很多坑,比如:打开自己以前的Swift项目,就会报几百个错误,这些都是语法上的错误,因为在Swift3.0中的语法和之前版本的Swift有很大的出入, 根据它的提示,将原来的语法,变成Swift3.0的语法,然后save即可.

Swift3.0 有什么改变呢?

(一), 函数或方法参数有变动

  • 在Swift3.0之前, 方法的参数的名称默认第0个是省略的,也就是说在第1个参数时才会有名称
    Swift3.0必须每个参数都需要指明参数的名称, 当然我们可以使用"_"来修饰参数,说明在调用的时候可以省略
 // 以前的做法
 func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 }  // 方法
 sum( 15, num2: 15) // 调用方法
 
 // swift3.0的做法
 func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 }  // 方法
 sum( num: 15, num2: 15) // 调用方法

(二), 取消了var参数,原因是和inout冲突了

  • 1, 以前在方法中将参数设置为变量时,只需要在变量前设置为var即可,但是在Swift3.0中就会报错, 不能直接在方法中使用var来设置变量
// 在Swift3.0之前
 func increase (var a: Int) {
    
     a += 1
 }
 
 // swift3.0
 func increase ( a: Int) {
 
 var a = a
 a += 1
 }
  • 2, 虽然在方法或者函数中不能使用var,但是可以使用inout, 但是,这里有一个细节, 就是inout的位置
 例如:
 // 在Swift3.0之前
 func increase (inout a: Int) {
     a += 1
 }
 
 // 在Swift3.0之后就不能这样了
 func increase (a: inout Int) {
    a += 1
 }

(三), 在Swift3.0中方法的返回值必须要有接收,否则就会报警告或者报错,主要的目的就是提醒开发者需要接收方法的返回值,当我们不需要接收返回值时,我们有两种方法告诉编译器此方法可以不用接收方法的返回值

override func viewDidLoad() {
 super.viewDidLoad()
 
 方式一: 需要@discardableResult
 let ca = function()
 ca.sum(a: 10, b: 10) // 这里会有一个警告,提示开发者需要接收返回值
 
 方式二: 不需要@discardableResult
 let _ = ca.sum(a: 10, b:10)
 
 }
 
 struct function {
 
 @discardableResult
 func sum(a: Int, b: Int) -> Int {
 return a + b
    }
 }

注意这里我们使用了struct, 我们来看看它和Class的区别
在Swift中struct与Class非常相似, 但是他们还是有点区别的
区别一: struct没有继承功能,但是class是可以继承的
区别二: 区别体现在内存上, struct是通过值传递的,而class是通过引用来传递的.

(四), 可选类型上的变化

  • 在Swift3.0开始可选类型就更加的严格了, 隐式的可选类型和其他类型的运算之后所得到的是可选类型,而不是隐式类型
 let a: Int! = 1
 let b = a + 1  // b是Int类型
 let c = a   // c是Int?类型
 
 print("b的值是\(b), c的值\(c)")

(五), 自定义代理协议时,也有一点变化

  • 在Swift3.0之前,定义协议只需要在协议(protocol)前面添加@objc即可,但是在Swict3.0中定义协议除了在协议前面加@objc外,在协议中的方法的修饰符前也要加@objc
 @objc pritocol SinaHomeDelegate {
 
    @objc optional func func1()
    func func2()
 }
 

(六), 在Swift3.0中移除了"++","--"两种自增或自减两种操作符

// 在swift3.0之前
 var a = 1
 a++  // 在旧版的Swift中这是可以的,但是在Swift3.0之后就会报错,不能这样写了
 
 // 在Swift3.0之后
 只能写成 var b = 1
 b = b + 1 或者 b += 1(建议写法)

(七), 取消了C语言中的for循环风格


// 在旧版的Swift中 for循环可以写成这种:
 for i = 0; i < 10; i += 1 {
 
     print(i)
 }
 
 // 但是在Swift3.0中不能这样写,这样会报错, 原因是在新版的Swift中已经移除了这种C语言样式的写法
 for i in 0..<10 {
    pring(i)
 }  // 正确写法

(八), SDK类中的变化

  • 在以前的Swift中,很多方法或者函数都和OC很像,所以对很多OC开发者来说,上手很容易,但是在Swift3.0后,彻底改变了
    这种情况,原因是这样可以消除函数又长又臭的缺点, 比如说: 消除了类型前缀,方法名去重, 函数和方法去C风格
// 1, 去掉类型前缀
 let url = URL(string:"www.baidu.com")  // 以前的NSURL变成了URL
 let data = Data()  // 以前的写法: let data = NSData(),显然现在的更加简洁
 
 // 2, 可读性更好了
 let isFileURL = url?.isFileURL // 以前的写法是url?.fileURL, 现在的写法可读性更好了
 
 // 3, 移除多余的动词,其他名词,介词修饰语,显然这样更加简单,简洁,易读
 var array = [1, 2, 3, 4]
 array.append(contentsOf: [4, 5, 6])  // 以前的写法: array.appendContentsOf([4, 5, 6])
 array.remove(at: 0) // 以前的写法: array.removeAtIndex(0)
 
 // 4, 在Swift3.0中尽量消除重复,可以减少语义歧义
 例如: 
 btn.backgroundColor = UIColor.red()  // 以前的写法: btn.backgroundColor = UIColor.redColor()
 
 // 5,枚举的成员首字母变成了小写
 label.textAlignment = .center  // 以前的写法: label.textAlignment = .Center
 
 // 如果按钮的状态是普通状态时,normal可以省略变为()
 
 let btn = UIButton()
 btn.setTitle("按钮", for: UIControlState()) // Nomal状态可以省略Normal
 btn.frame = CGRect(x: 100, y: 100, width: 50, height: 50)  // 不在是CGRectMake....
 btn.backgroundColor = UIColor.red()   // 不在是redColor()
 view.addSubview(btn)

(九), 去C风格后,易读性更好


 // 1, 设置控件的frame
 btn.frame = CGRect(x: 0, y: 0, width: 50, height: 50)  // 以前的写法: CGRectMake(0, 0, 50, 50)
 
 // 2, 语法简短易读
 if let context =
 
 // 3. GCD的使用也有变化
 
 // Swift3.0之前的写法是:
 let queue = dispatch_queue_create("myQueue", nil)
 dispatch_async(queue) {  // 异步执行queue队列中的函数
 
    // 执行闭包中的方法
    pringt("以前的写法")
 }
 
 // Swift3.0后的写法, 更加简洁,易读
 let queue = DispatchQueue(label: "myQueue")
 queue.async {
 
 // 执行异步函数
 print("hello Swift3.0")
 }

 // 4, 某些相关的常量定义被移动到了枚举内部,比如说通知的名称
 
 // 4.1, Swift3.0中的通知创建
 
 NotificationCenter.default.addObserver(self, selector: #selector(loadDatas()), name: UserDefaults.didChangeNotification, object: nil)
 

 
 
 // 但是在Swift3.0之前不是这样的(区别在与通知名)
 old:NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(loadDatas()), name: NSUserDefaultsDidChangeNotification, object: nil)

(十), 新的浮点型协议, Float, Double, CGFloat使用了新的协议,主要是提供了IEEE-754标准的属性和方法

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

推荐阅读更多精彩内容