Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】
-
一、编译器和语法变化
函数或方法参数
调用函数或方法时从第一个参数开始就必须指定参数名
在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发展初期很多类库的引入依然保持的ObjC风格,但是ObjC由于根出C语言,因此很多操作其实并不是对象和方法操作而是C语言的函数形式。到了Swift3.0之后这一现状将发生变化,全局函数将会变成某些类型的方法;某些常量定义将以某个枚举类型的成员来表示。
let rect1 = CGRect(x: 0, y: 0, width: 100, height: 100)
// 下面的代码将要报错,3.0完全废除这种类C的风格
//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三、从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 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 1.2适配swift2.0遇到的改变
swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sor ...
- Swift互用性:与 Cocoa 数据类型共舞(Swift 2.0版)-b
本节内容包括: 字符串(Strings) 数值(Numbers) 集合类(Collection Classes) 错误(Errors) Foundation数据类型(Foundation Data T ...
- swift语言点评十五-$0
import UIKitimport XCPlayground class ViewController: UIViewController { func action() { print(" ...
- 给swift程序猿留下深刻印象的10个Swift代码
通过使用单行代码完成同样的 10 个练习,我们来看看 Swift 和其他语言之间的较量. 将数组中每个元素的值乘以 2 使用map来实现 var arr = [1,2,3,4]; var newArr ...
- Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)
当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:5 ...
- Swift版音乐播放器(简化版),swift音乐播放器
这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...
- Swift要点:从Objective-C开发者的角度看Swift
代码环境是Xcode6.3-Beta3. Swift已经极大的改变了开发iOS应用的方式.本文中,我会列出Swift的几个重点,并且和Objective-C一一做出对比. 注意,本文不是Swift的入 ...
- 《从零开始学Swift》学习笔记(Day2)——使用Web网站编写Swift代码
Swift 2.0学习笔记——使用Web网站编写Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 Swift程序不能在Windows其他平台编译和运行,有人提供了一个网站swiftstub ...
- SATA1.0,2.0,3.0区别
外观没区别,接口都一样,线也一样,就是传输速率不一样,控制芯片不一样SATA1.0理论传输速度为1.5Gbit/s SATA2.0理论传输速度为3Gbit/sSATA2.0理论传输速度为6Gbit/s ...
随机推荐
- 迅为最新推出iTOP-6818开发平台无缝支持4418开发板
iTOP-6818开发板是一款四核ARM 八核开发板与iTOP-4418开发板完全兼容,CPU主频1.4GHz,内存1GB DDR3(2GB可选),存储16GB EMMC,板载千兆以太网,GPS,WI ...
- java 移位运算符
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- Slam(即时定位与地图构建) 知识篇
Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...
- Intellij Idea中定制getter setter的模板
Alt + Ins, 调出快捷菜单后选择 Getter and Setter, 在对话框里, 选择对应的template, 右侧点开后, 可以新建自己的模板并编辑 将getter和setter都生成到 ...
- Mersenne twister 随机数算法实现 in Scheme
这个实现基本上是从 Wiki 上的 Python 版翻译过来的,大量使用了赋值. ;; Mersenne twister algorithm from Wikipedia ;; returns a c ...
- 用于制作app store的截图的工具:Brief Wrapper —— 最便捷的应用商店屏幕快照
https://itunes.apple.com/cn/app/brief-wrapper-zui-bian-jie/id991730319?l=en&mt=8 可以快捷的做出类似于下面的这种 ...
- Windows phone应用开发[21]-图片性能优化
在windows phone 中常在列表中会常包含比较丰富文字和图片混排数据信息. 针对列表数据中除了谈到listbox等控件自身数据虚拟化问题外.虽然wp硬件设备随着SDK 8.0 发布得到应用可使 ...
- android JSON获取值String无法转换成JSONObject
项目中,已经获取到服务器返回的XML,并且已经解析. value= (String) result.getProperty("Value").toString().trim();J ...
- 【JavaScript】图片上传预览
上传文件实时显示[一张图片]: 个人理解:给img的src传值:这个值就是input[type='file']的value: 不过你要判断浏览器类型[很多]:IE6.0,IE7/8/9,Fixfox7 ...
- C#时间戳转时间-时间转时间戳
/// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name=”timeStamp”></para ...