Swift3.0新内容

在WWDC16上苹果公布了Swift3.0,新的变化几乎会让你的代码处处报错,但正是借助于苹果这种追求极致的精神,Swift才会发展的如此迅速,下面对Swift3.0带来的变化稍作总结。

基本语法

  1. 调用函数时首个参数必须指定参数名;
    在Swift3.0中不管是函数还是方法从第一个参数开始必须指定参数名(也可以使用"_"省略参数)
func sum(num1: Int, num2: Int) -> Int {
    return num1 + num2
}
sum(num1: 1, num2: 2)
  1. 函数参数取消可变类型;
// func increase(var a: Int) {
//   a += 1
// }
// 上面的写法会报错,可改为
func increase(a: Int) {
    var a = a
    a += 1
}
  1. inout参数修饰改放到参数类型前面;
// func increase(inout a: Int) {
//   a += 1
// }
// 上面的写法会报错,可改为
func increase( a:inout Int) {
    a += 1
}
  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)
  1. 隐式可选类型和其他类型运算后获得可选类型而不是隐式可选类型;
let a: Int! = 1
// 此时强制解包
let b = a + 1
// 注意此时c是Int? 在之前版本中c是Int!
let c = a 
  1. 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:))
    }
}
  1. 定义协议中可选方法必须使用@objc来修饰;
@objc protocol MyProtocol {
    // old: optional func func1()
    @objc optional func func1() 
    func func2()
}
  1. 取消++、--操作符;
  2. 取消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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,775评论 1 10
  • 1、随机数 不需要随机数种子 arc4random()%N + begin:产生begin~begin+N的随机数...
    我是小胡胡分胡阅读 4,136评论 0 2
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,175评论 3 25
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,452评论 0 4
  • 空荡的列车向前开,耳边响起的是老旧喇叭撕裂的歌声,万幸那曲调是悠扬的,亦如车窗外飞驰向后的风景。这一曲的欢然,让人...
    化浊阅读 337评论 0 1