设为首页 加入收藏

TOP

iOS开发系列--Swift 3.0(一)
2017-10-13 10:22:59 】 浏览:3745
Tags:iOS 开发 系列 --Swift 3.0

概述

从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行。在WWDC16上Apple公布了Swift3.0,从中可以看出Apple对Swift的重视,以及Swift开源半年以来的进步。尽管对于开发人员来说Swift3.0的变化会令你的程序几乎处处报错,但是试想一下如果Apple没有追求极致的精神又怎么会做出如此多的更改。今天的文章将重点介绍:What's new in Swift 3.0?从Swift编译器和标准库两个方面来说明从Swift3.0的变化。

编译器和语法变化

函数或方法参数

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

在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发展初期

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HTTP和GET/POST请求(NSURLConnect.. 下一篇iOS程序启动的过程及原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目