谈谈Swift3.0(一)

引言

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界面

谈谈Swift3.0(一)_第1张图片
Snip20170131_3.png

谈谈Swift3.0(一)_第2张图片
Snip20170131_2.png

贴代码:

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/

你可能感兴趣的:(谈谈Swift3.0(一))