引言
Apple与今年6月13日正式发布了Swift3.0的第一个预览版本,并且相应推出了Xcode8的第一个bate版本。开发者已经可以在Xcode8bate版上来体验Swift3.0的新特性。首先,Swift3.0确实带来了很大改变,许多Swift中的结构体API都进行了更新,例如String,Array等,Swift3.0版本将许多类Objective-C风格的API都更换成了Swift风格的,其目的使开发者可以使用Swift更加惬意有趣的编程。本系列博客,是我观看WWDC视频中介绍的内容以及Swift3.0的开发者帮助文档整理总结而来,在期间,我也参考对比了Swift2.2中的实现方式,希望可以帮助需要的朋友尽快熟悉和上手Swift3.0。
API变化
去掉
i++ ++i i-- --i
语法,开发者可以用i+=1 i-=1
代替。for循环:
*** 摒弃C风格的for循环:***
for (var i = 0; i < 10; i++){print)(i)}
*** 常用的for循环写法:***
//[1-10]
for (i in 1...10) {print(i)}
//[1,10)
for (i in 1...<10) {print(i)}
//[10, 1]
for (i in 1...10).reversed() {print(i)}
//(10, 1]
for (i in 1...<10).reversed() {print(i)}
*** 用stride
关键字描述for循环(by的意思是步长): ***
// 从0到10 步长为2,to是开区间,不包括10,所以控制台打印 0 2 4 6 8
for i in stride(from:0, to:10, by:2){print(i)}
// 从0到10 步长为2,through是闭区间,包括10,所以控制台打印 0 2 4 6 8 10
for i in stride(from:0, through:10, by:2){print(i)}
// 从10到0步长为0.1
for i in stride(from:10, through:0, by:0.1){print(i)}
// 从10.5到0步长为0.1
for i in stride(from:10.5, through:0, by:0.1){print(i)}
- 元组
*** 元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型 ***
// httpError 的类型是 (Int, String),值是 (404, "Not Found")
let httpError = (404, "Not Found")
// 把元组的内容分解成单独的常量和变量
let (name, age) = ("wang", 3)
print("The name is \(name)") // 打印wang
// 如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
let (name, _) = ("wang", 3)
print("The name is \(name)") // 打印wang
// 定义元组给每个元素单独起名字:
let person = (name:"wang", age:3)
print("The name is \(person.name)") // 打印wang
*** 元组取值方式 ***
let person = ("wang", 3)
print("The name is \(person.1)") // 打印3
let person = (name:"wang", age:3)
print("The name is \(person.name)") // 打印wang
*** 元组的比较***
// 通过下面两组比较不难发现,元组是通过维度来比较值的。例如:如果Math的值不相等,则score0与score1的比较结果是依据Math的值决定的;如果Math的值相等,则score0与score1的比较结果是依据English的值决定的。多个维度的也是按照此方式进行比较的,大家可以尝试一下。
//1.第1组:
let score0 = (Math:100, English:100)
let score1 = (Math:99, English:100)
print(score0 == score1) // 打印false
print(score0 > score1) // 打印true
//2.第2组:
let score0 = (Math:100, English:99)
let score1 = (Math:100, English:100)
print(score0 == score1) // 打印false
print(score0 > score1) // 打印false
print(score0 < score1) // 打印true
// 元组运算符的重载机制。那什么时候需要这个重载呢?例如:我想拿出元组中English的值来衡量score0和score1的大小,而不是按照从左到右的维度来比较。
let score0 = (Math:1, English:100)
let score1 = (Math:89, English:100)
// 在Swift中运算符本质上是函数
func <(s1:(Int, Int), s2:(Int, Int)) ->Bool {
if s1.1 != s2.1 {
return s1.0 < s2.0
}
return s1.1 < s2.1
}
print(score0 < score1) // 打印false
// 元组函数传值
func printScore(Math:Int, English:Int) {
print("The Math Score is\(Math), The English Score is\(English)")
}
//在Swift2.0中是这样调用的:
printScore(score0)
// 在Swift3.0中是这样调用的:
printScore(score0.Math, score0.English)
- Selector语法
想必有过OC开发经验的同学应该都会知道selector的含义是啥吧,这里不再赘述
Swift3.0可以在playground中直接支持显示和操作界面
使用之前需要
import PlaygroudSupport
,不然没法使用。
点击View-Assistant Editor-show Assisitant Editor调出UI界面
贴代码:
class ViewController:UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
btn.setTitle("haha", for: UIControlState.normal);
btn.backgroundColor = UIColor.blue
//这个#selector()是Swift3.0新的写法,写错或者不实现方法都会报错提示,比起Swift2输入字符串的方式更加智能。
btn.addTarget(self, action: #selector(click), for: UIControlEvents.touchUpInside)
self.view.addSubview(btn)
}
func click(button:UIButton) {
if button.backgroundColor == UIColor.blue {
button.backgroundColor = UIColor.red
} else {
button.backgroundColor = UIColor.blue
}
}
}
var vc = ViewController()
vc.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
PlaygroundPage.current.liveView = vc.view
参考资料
https://developer.apple.com/swift/resources/