Swift_3.0 【Swift_3.0 相较于 Swift_2.2 的变化】

Swift_3.0 【Swift_3.0 相较于 Swift_2.2 的变化】,第1张

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



函数或方法参数


@H_502_13@ 调用函数或方法时从第一个参数开始就必须指定参数名 在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)
@H_502_13@ 取消var参数
//func increase(var a:Int){// a += 1//}// 上面的代码会报错,可改写成func increase(a:Int){    var a = a    a += 1}
@H_502_13@ 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! = 1let 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 = 1d++ //报错,可以改写成 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,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,name: NSUserDefaultsDIDChangeNotification,object: nil)

集合API的变化


let array1 = [1,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_PIlet 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开发还是有存在必要的。 总结

以上是内存溢出为你收集整理的Swift_3.0 【Swift_3.0 相较于 Swift_2.2 的变化】全部内容,希望文章能够帮你解决Swift_3.0 【Swift_3.0 相较于 Swift_2.2 的变化】所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1071490.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存