swift3.0的一些修改

Swift 3.0 在参数传递、命名规范、可选类型处理等方面进行了重大更新,同时对 iOS SDK 10 进行了调整,包括简化命名、移除冗余表达式及更改方法返回值处理等。

Swift 3.0去除了大量冗余的东西,并且把库做了深度的修整。
简单的描述一些修改:
一、参数的修改

Swift 3 对参数的传入做了大幅改动,主要是添加了参数名称的限定,使用单个下划线作为允许匿名符号。参考以下实例:

override func viewWillAppear(animated: Bool)
//被改为
override func viewWillAppear(_ animated: Bool)
//下面再看一个实例的调用例子,加深印象:
func myFunc(x: Int, y: Int)
这个函数在调用时必须使用以下代码
myFunc(x: 1, y: 2)
若是允许匿名参数,则修改之:

func myFunc(_ x: Int, _ y: Int)
这个函数在调用时允许不带参数名称
myFunc(1, 2)

这样的改动较大程度的影响了原有继承下来的方法,如viewWillAppear,UITableView 的回调函数等。对于自己写的方法,稍加注意即可,这两种方法都有着各自适用的场景。

二、去重

Swift 3 对于重复输入的表达式深恶痛绝,通过例子我们可以推断出其他类似的改动,如:

UIColor.whiteColor() 
//被改为
UIColor.white()

list.objectAtIndex(i)
//被改为
list.object(at: i)

//同样的,方法也被如此修改了,如:
presentViewController(controller, animated: true)
//被改为
present(toViewController: controller, animated: true)

dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath)
//被改为
dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

func numberOfSectionsInTableView(tableView: UITableView) -> Int
//被改为
func numberOfSections(in tableView: UITableView) -> Int

这样的改动几乎发生在每一处函数调用,这使用开发人员不得不重新审视几乎所有的代码,因为老的代码可能都在新的 SDK 下变得毫无建树。

三、方法的返回值处理

我们在开发中可能会经常调用一些带有返回值的方法,但是却不处理返回值,例如以下这种:

navigationController!.popViewControllerAnimated(true)
这个方法实际上返回一个 UIViewController,但是很少有人会用,更多的场景是把它当成无返回的方法来使用。但是在 Swift 3 中,这样做是不行的,你必须处理掉这个返回值,如下:

//使用单个下划线来指代一个不会被使用的变量。
let _ = navigationController!.popViewController(animated: true)

//Swift 3 不再允许传入传出的对象,之前带有 var 的方法声明将全部作废:
func myFunc(var a: Int) -> Int
//如以上这种声明,已不可再使用,对于有多个值要返回的方法,必须改为:
fun myFunc(a: Int) -> (Int, Int)

四、Selector

我们来细数一下经历过的版本:
self.performSelector(onMainThread: #selector(handle(ret:)), with: ret, waitUntilDone: true)

 //Swift 3#selector(ViewController.handle(_:))   
 // 2.2#selector(ViewController.handle(:))     
 // 2.1#selector(handle)                     
 // 2.0@selector("handle:")                    

需要注意的是,Selector 的方法名和参数名必须与实际被调用的方法完全一致,否则编译时就会报错。

另外,Selector 传参时,只能传递对象,不能传基础数据类型,传基础数据类型的情况下,一律变成0。虽说苹果已经把大部分的 NS 类都去掉了前缀,但是 NSNumber 这东西还是得经常用一下呢,至少目前是这样的。

五、命名

在早期的 Objective-C 或 Swift 中,系统内的常量、函数等的命名一直是一件让人头疼的事,例如UIControlContentHorizontalAlignmentCenter这种,特别长,超级难记,虽说有 Xcode 这种强大的 IDE,也难免会弄错。在 Swift 3 内,所有的相关常量都被划到指定的枚举类中,而常量和函数均遵守相当良好的代码规范。来看几个实例:

lbl.textAlignment = NSTextAlignment.Center
//被改为
lbl.textAlignment = NSTextAlignment.center

tableFooterView = UIView(frame: CGRectZero)
//被改为
tableFooterView = UIView(frame: CGRect.zero)

另外,现在的新的命名方式也更注重突出实际作用,再给个例子体会下:
lbl.hidden = false
//被改为
lbl.isHidden = false

与此同时,所有NS类的类名也变得简洁了,不再需要NS前缀,再配合其他的改动(如去重),对代码的精简形成了相当大的影响:
let bundle = NSBundle.mainBundle()
//被改为
let bundle = Bundle.main()

let mgr = NSFileManager.defaultManager()
//被改为
let mgr = FileManager.default()

这样的改动几乎也牵动了全部的代码!

六、可选类型

Swift 3 对可选类型的处理更严格了,必须显式的在任何地方使用感叹号,例如我们有以下代码:

var str: String! = "a"
var s = str
print(s)
//正确的处理方式是:
var str: String! = "a"
var s = str!
print(s)
//或者
var str: String! = "a"
var s = str
print(s!)

同样的,在实际开发中,如果用到字符串模板,也需要非常注意这样的变化:
var str  = "Loaded: \(data)"
//需要被修改为
var str  = "Loaded: \(data!)"

七、类库

随着 Swift 3 一起发布的 iOS SDK 10,其改动也不小,特别是对一些类库的改动,删除了大量的方法,类库的改动没有办法一一说明,所以就只讲几个例子。

//针对有 option 选项的 protocol,目前强制要求为每一条都写上 @objc,如:

@objc protocol MyProtocol: NSObjectProtocol {
      optional func foo(myClass: MyClass?)
      optional func bar(myClass: MyClass?)
}
//需要改为
@objc protocol MyProtocol: NSObjectProtocol {
      @objc optional func foo(myClass: MyClass?)
      @objc optional func bar(myClass: MyClass?)
}

//不再有CGRectMake,CGSizeMake等常用函数了,如:
UIView(frame: CGRectMake(0, 0, 48, 48))
//被改为
UIView(frame: CGRect(x: 0, y: 0, width: 48, height: 48))

//Normal选项用方括号对来代替,如:
btn.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
//被改为
btn.setTitleColor(UIColor.white(), for: [])

UIControlState内已经没有normal这个选项了,目前也只能这么做。方括号非常容易引起对于数组或是集合等的联想,但是此处却又完全不是数组或集合,方括号的语义并不清晰。

图形图象库有较大改动,给个具体例子参考下:
let imgData = UIImageJPEGRepresentation(img, 1)
let imgPath = "\(FileUtils.getDocumentPath())/\(name)"
imgData!.writeToFile(imgPath, atomically: true)
//必须改为
let imgData = UIImageJPEGRepresentation(img, 1)
let imgPath = "\(FileUtils.getDocumentPath()!)/\(name!)"
NSData(data: imgData!).write(toFile: imgPath, atomically: true)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值