在WWDC16上苹果公布了Swift3.0,新的变化几乎会让你的代码处处报错,但正是借助于苹果这种追求极致的精神,Swift才会发展的如此迅速,下面对Swift3.0带来的变化稍作总结。
基本语法
- 调用函数时首个参数必须指定参数名;
在Swift3.0中不管是函数还是方法从第一个参数开始必须指定参数名(也可以使用"_"省略参数)
func sum(num1: Int, num2: Int) -> Int {
return num1 + num2
}
sum(num1: 1, num2: 2)
- 函数参数取消可变类型;
// 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
}
- 必须接受或者处理函数返回值;
Swift3.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)
// 添加@discardableResult声明后不会警告
ca.func1(a: 1, b: 2)
- 隐式可选类型和其他类型运算后获得可选类型而不是隐式可选类型;
let a: Int! = 1
// 此时强制解包
let b = a + 1
// 注意此时c是Int? 在之前版本中c是Int!
let c = a
- selector格式改变为#selector(method(param1: param2:));
class MyClass {
@objc func sum(a: Int,b: Int) -> Int {
return a + b
}
func func1(){
let _ = #selector(sum(a: b:))
}
}
- 定义协议中可选方法必须使用@objc来修饰;
@objc protocol MyProtocol {
// old: optional func func1()
@objc optional func func1()
func func2()
}
- 取消++、--操作符;
- 取消C语言风格for循环;
// for var i = 0 ;i < 10 ; i += 1 {
// debugPrint(i)
// }
// 上面写法会报错,改为如下
for i in 0 ..< 10 {
debugPrint(i)
}
SDK类库
早起Swift为了保证OC开发人员顺利过渡到Swift,很多类库和方法命名都尽量和OC保持一致,但是作为一门新语言Swift需要不断做出改变,这其中包括重新导入Foundation消除类型前缀、方法名去重、函数和方法去C风格等等。
命名方式
// 1.去掉前缀
let url1 = URL(string: "www.cmjstudio.com")
let isFileURL = url1?.isFileURL // old:url1.fileURL 现在更加注重语意
let data1 = Data()
// 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初期很多类库的引入依然保持OC风格,但是由于OC根出自C语言,因此很多操作是C语言的函数形式,Swift3.0之后全局函数将会变成某些类型的方法,某些常量定义将以某个枚举类型的成员来表示;
let rect1 = CGRect(x: 0, y: 0, width: 100, height: 100)
// 下面的代码会报错,3.0将废除这种类C风格
// old: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
最后有必要提一下,之前有传闻说Swift3.0的语法和API都会稳定并且向上兼容,但是WWDC上官方证实这可能要到4.0才能实现。但是过早的固定语法和API对于Swift的发展也不一定是好事,毕竟新特性的加入、更好的语法优化才能让Swift越来越好,更何况Apple提供了迁移工具也大大减少了迁移工作量。
原文来自http://www.cnblogs.com/kenshincui/p/5594951.html