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

Snip20170131_3.png

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/

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

推荐阅读更多精彩内容

  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,364评论 0 12
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,460评论 1 14
  • 写这篇文章的时候,我辗转了很久该不该写,后来还是决定要写,原因竟然是因为一个同学最后没能下定决心要离开自己不喜欢...
    泽西_阅读 238评论 0 0
  • 2017年5月16日 星期一 中雨 晚上晨睿说她昨天、前天的计算题没做,加上今天的,一共要...
    A小青竹阅读 199评论 0 0
  • 我畏惧且羡慕那些喜欢读诗的人。我喜欢买诗集,却不曾读过完整一本,面对躺在书架上的诗,我是心怀愧疚的,但面...
    查拉图王子不曰阅读 304评论 0 0