• Swift_3.0 相对于 Swift_2.2 版本发生了哪些的变化。本文件将以最直观的代码对比以及文字分析阐述。

    一、编译器和语法变化



    函数或方法参数


    • 调用函数或方法时从第一个参数开始就必须指定参数名

    在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况,而在Swift3.0中不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。

    // 从第一个参数就必须指定参数名,除非使用"_"明确指出省略参数
    func sum(num1:Int,num2:Int)->Int{
        return num1 + num2
    }
    
    sum(num1: 1, num2: 2) // old: sum(1,2)或者sum(1, num2: 2)
    • 取消var参数

    //func increase(var a:Int){
    //    a += 1
    //}
    // 上面的代码会报错,可改写成
    func increase(a:Int){
        var a = a
        a += 1
    }
    • inout参数修饰改放到类型前

    //func increase(inout a:Int) {
    //    a += 1
    //}
    // 上面的代码会报错,可改为
    func increase( a:inout Int) {
        a += 1
    }


    方法返回值


    Swift 3.0 中方法的返回值必须有接收否则会报警告,当然其实主要目的是为了避免开发人员忘记接收返回值的情况,但是有些情况下确实不需要使用返回值可以使用"_"接收来忽略返回值。当然你也可以增加@discardableResult声明,告诉编译器此方法可以不用接收返回值。

    struct Caculator {
        func sum(a:Int,b:Int) -> Int {
            return a + b
        }
        
        @discardableResult
        func func1(a:Int,b:Int) ->Int {
            return a - b + 1
        }
    }
    let ca = Caculator()
    ca.sum(a: 1, b: 2) // 此处会警告,因为方法有返回值但是没有接收
    let _ = ca.sum(a: 1, b: 2) // 使用"_"接收无用返回值
    ca.func1(a: 1, b: 2) // 由于func1添加了@discardableResult声明,即使不接收返回值也不会警告


    可选类型


    Swift3.0对于可选类型控制更加严谨,隐式可选类型和其他类型的运算之后获得的是可选类型而不是隐式可选类型。

    let a:Int! = 1
    let b = a + 1 // 此时强制解包,b是Int型
    let c = a // 注意此时c是Int? 在之前的Swift版本中c是Int!


    Selector的变化


    Selector的改变其实从1.0到3.0经历了多次变化,从最早的@Selector("method:")到现在的#selector(method(param1:))可以说经历了多次修改,好在它变得越来越好,毕竟字符串操作对于语法检查来说是很无助的。

    class MyClass {
        @objc func sum(a:Int,b:Int) -> Int {
            return a + b
        }
        
        func func1(){
            let _ = #selector(sum(a:b:))
        }
    }
    
    // old: Swift 2.2
    //class MyClass {
    //    @objc func sum(a:Int,b:Int) -> Int {
    //        return a + b
    //    }
    //    
    //    func func1(){
    //        let _ = #selector(sum(_:b:))
    //    }
    //}


    协议中的可选方法


    在Swift3.0之前如果要定义协议中可选方法,只需要给协议加上@objc之后方法使用optional修饰就可以了,但是Swift3.0中除了协议需要@objc修饰,可选方法也必须使用@objc来修饰。

    @objc protocol MyProtocol {
        @objc optional func func1() //old: optional func func1()
        func func2()
    }


    取消++、--操作符


    var d = 1
    d++ //报错,可以改写成 d += 1 或者 d = d + 1


    取消C风格for循环


    //for var i = 0 ;i < 10 ; i += 1 {
    //    debugPrint(i)
    //}
    // 上面的代码会报错,可改写成如下代码
    for i in 0  ..< 10  {
        debugPrint(i)
    }



    二、SDK类库变化


    大家都知道Swift诞生在Objective-C已经发展的相当成熟的情况下,为了保证ObjC开发人员顺利过渡到Swift,也因为Swift处于初级阶段,很多类库和方法命名都尽量和ObjC保持一致,在使用Swift开发iOS应用中处处可以看到ObjC的影子。但是作为一门Modern语言Swift还是做出了改变,从中可以看出日后Swift将彻底摆脱ObjC的影子。这其中包括重新导入Foundation消除类型前缀、方法名去重、函数和方法去C风格等等。


    命名


    // 1.去掉前缀
    let url1 = URL(string: "www.cmjstudio.com")
    let isFileURL = url1?.isFileURL //old:url1.fileURL ,现在更加注重语意
    let data1 = Data() //NSData
    
    // 2.方法名使用动词,其他名词、介词等作为参数或移除
    var array1 = [1,2,3]
    array1.append(contentsOf: [4,5,6]) // old:array1.appendContentsOf([4,5,6])
    array1.remove(at: 0) // old:array1.removeAtIndex(0)
    
    // 3.不引起歧义的情况下尽量消除重复
    let color1 = UIColor.red() // old:var color1 = UIColor.redColor()
    
    // 4.枚举成员首字母变成小写
    let label1 = UILabel()
    label1.textAlignment = .center // old:label1.textAlignment = .Center
    
    // 5.按钮的Normal状态去掉
    let btn1 = UIButton()
    btn1.setTitle("hello", for: UIControlState()) // 相当于Normal状态


    去C风格


    Swift发展初期很多类库的引入依然保持的ObjC风格,但是ObjC由于根出C语言,因此很多操作其实并不是对象和方法操作而是C语言的函数形式。到了Swift3.0之后这一现状将发生变化,全局函数将会变成某些类型的方法;某些常量定义将以某个枚举类型的成员来表示。

    let rect1 = CGRect(x: 0, y: 0, width: 100, height: 100)
    // 下面的代码将要报错,3.0完全废除这种类C的风格
    //let rect1 = CGRectMake(0, 0, 100, 100)
    
    if let context1 = UIGraphicsGetCurrentContext() {
        CGContext.fillPath(context1) // old:CGContextFillPath(context1!)
    }
    
    // GCD的改变
    let queue = DispatchQueue(label: "myqueue")
    queue.async {
        debugPrint("hello world!")
    }
    // old:
    //let queue = dispatch_queue_create("myqueue", nil)
    //dispatch_async(queue) {
    //    debugPrint("hello world!")
    //}
    
    // 相关常量定义被移到枚举内部
    NotificationCenter.defaultCenter().addObserver(self, selector: #selector(userDefaultChange()), name: UserDefaults.didChangeNotification, object: nil)
    //old:NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(userDefaultChange()), name: NSUserDefaultsDidChangeNotification, object: nil)


    集合API的变化


    let array1 = [1,2,3]
    let next = array1.index(after: 0)  // old:let start = array1.startIndex let next = start.successor()
    let first = array1.first { (element) -> Bool in // 增加新的方法
        element > 1
    }
    
    let r = Range(0..<3) //old: let _ = NSRange(location: 0, length: 3)
    
    // 下面的代码必须在控制器中执行,用于遍历当前view及其父视图
    for subview in sequence(first: self.view, next: { $0?.superview }){
        debugPrint(subview)
    }


    新的浮点协议


    Float、Double、CGFloat使用了新的协议,提供了提供 IEEE-754标准的属性和方法。

    let a = 2 * Float.pi // old: let a = 2 * M_PI
    let b = 2.0 * .pi // 注意前面是浮点型,后面可以省略Float



    三、从Swift_2.2迁移到Swift_3.0


    可以看出如果要更新到Swift3.0现有项目需要作出大量修改,经过使用之前的项目进行测试,区区十个类文件就出现了一百多个错误,不过好在Xcode 8已经提供了很好用的迁移工具(Xcode:Editor - Convert - To Current Swift Syntax),经过迁移工具转化后仅仅发现两处错误需要手动修正。在使用这个工具的时候大家会看到如下界面:



    Swift 2.3?没错Swift2.2和Swift 3.0中间还有个Swift 2.3,Apple也解释了什么是Swift 2.3,其实就是Swift 2.2 + New SDKs。之所以如此是因为Xcode 8目前还是beta版,使用Swift 3.0进行开发的应用还不能提交App Store,因此在Swift 2.2基础上使用新的SDK开发还是有存在必要的。

    展开全文
  • swift3.0 让方法参数可修改方法
  • 我们知道在Swift2中,默认情况下方法的参数是let值,也就是不改变的.不过我们可以在参数前添加var关键字改变其不变性:func foo(var i:Int){ i += 1 print(i) }不过遗憾的是在Swift2.x+中,已经明确表明方法参数的...
  • 每当看到新的编程语言我总是会有相当大的兴趣,是的,Swift 3是一门『新语言』,因为它看起来,怎么都不像过往的 Swift。打开一个老的项目时,发现满目疮痍,基本上能标红的代码全被标红了。先来个截图提提神: 图...
  • swift3.0 字典的基本用法 2016-10-27 11:51:57
    自学swift3.0,如果有什么错误或建议的话欢迎吐槽哦~ //1.字典的定义使用[key:value,key:value]快速定义 let dic:[String:Any] = ["name":"张三","age":22] print(dic) //数组字典 let arrDic:[[String
  • Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4 为外部参数设置默认值 开发者也可以对外部参数设置默认值。这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0...
  • 在这里列举出一些在网上收集到的关于Swift 3.0的变化,技术更新太快,越来越fashion!!! Swift编译器和标准库的改变 1、编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须...
  • Swift3.0 - 函数和闭包 2019-03-11 18:00:37
    Swift3.0 - 真的很简单 Swift3.0 - 数据类型 ...Swift3.0 - 选值 Swift3.0 - 集合 Swift3.0 - 流控制 Swift3.0 - 对象和类 Swift3.0 - 属性 Swift3.0 - 函数和闭包 Swift3.0 - 初始化和释放 Swift3...
  • Swift 是苹果遵循 Apache 开源授权协议开源的一门编程语言 Swift 3 源代码不兼容旧版本,主要是因为 SE-0005 和 SE-0006 的改进,这些改进不仅影响 Standard Library APIs 命名,还会完全改变 Objective-C APIs ...
  • Swift 3.0 笔记 2016-10-19 17:19:07
    这是我对 Swift 3.0 整理的笔记,主要内容来自于官方文档,添加了一些指针的内容在最后。该笔记由于只是我个人用于学习整理以及回顾使用,所以没有对单项技术做太过深入的解析。如果你需要完整清晰的知识点解析,请...
  • Swift3.0变化分享 2019-07-22 13:35:08
    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备。Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每...
  • swift3.0 基础知识点 2016-11-21 19:29:23
    // ViewController.swift // swift_01 // // Created by weiphone on 16/8/26. // Copyright © 2016年 weiphone. All rights reserved. // import UIKit class ViewContr
  • Swift3.0 指针 2017-04-06 09:30:58
    学习UnsafePointer, UnsafeMutablePointer, UnsafeRawPointer,UnsafeMutableRawPointer
  • 基础部分(The Basics) 1.0 翻译:numbbbbb, lyuka, JaySurplus 校对:lslxdx 2.0 翻译+校对:xtymichael 2.1 翻译:Prayer 校对:shanks,overtrue ...常量和变量声明常量和变量类型标注常量和
  • Swift3.0要注意的地方 2017-01-04 10:29:44
    都知道苹果要在下个版本的Xcode中移除Swift2.3的支持,强制开发者使用Swift3.0,这是一个很悲痛的现实��。然而正好公司的项目是OC和Swift混编的项目,里面用到了一个第三方库SwiftBond,当时SwiftBond还没有升级...
  • Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
  • //: Playground - noun: a place where people ...可变参数 * 2.函数形参的性质(**) * 3.函数类型Function Type(***) * 4.函数类型作为其他函数参数 * 5.函数类型作为其他函数的返回值 */ print("hello", "wo
1 2 3 4 5 ... 20
收藏数 1,787
精华内容 714