博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【30-swift-projects-in-30-days】swift 5 学习 02.Watch'sDemo
阅读量:6424 次
发布时间:2019-06-23

本文共 2890 字,大约阅读时间需要 9 分钟。

hot3.png

【30-swift-projects-in-30-days】Swift 5 学习记录

在 02.Watch'sDemo 项目中主要学习的是SnapKit的进一步使用和定时器Timer,guard语句的使用。

1.Timer的使用

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(time), userInfo: nil, repeats: true)//开始计时器timer.fire()//暂停timer.fireDate = Date.distantFuture//继续timer.fireDate = NSDate.init() as Datetimer.fireDate = Date.distantPast//消除计时器(页面释放是必须调用这个方法,不让会让页面和定时器不会释放)timer.invalidate()//滑动timer失效是添加RunLoop.current.add(timer, forMode: .commonModes)

2.guard的用法

guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。但与if语句不同的是,guard语句只会有一个代码块,不像if语句可以if else多个代码块。

那么guard语句的作用到底是什么呢?顾名思义,就是守护。guard语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句,我们举例来看看。

我们以今年高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法:

func checkup(person: [String: String!]) {       // 检查身份证,如果身份证没带,则不能进入考场    guard let id = person["id"] else {        print("没有身份证,不能进入考场!")        return    }         // 检查准考证,如果准考证没带,则不能进入考场    guard let examNumber = person["examNumber"] else {        print("没有准考证,不能进入考场!")        return    }         // 身份证和准考证齐全,方可进入考场    print("您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!")     } checkup(["id": "123456"]) // 没有准考证,不能进入考场!checkup(["examNumber": "654321"]) // 没有身份证,不能进入考场!checkup(["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!

上述代码中的第一个guard语句用于检查身份证,如果检查到身份证没带,也就是表达式为false时,执行大括号里的代码,并返回。第二个guard语句则检查准考证。

如果两证齐全,则执行最后一个打印语句,上面的两个guard语句大括号内的代码都不会执行,因为他们表达式的布尔值都是true

这里值得注意的是,idexamNumber可以在guard语句之外使用,也就是说当guard对其表达式进行验证后,idexamNumber可在整个方法的作用域中使用,并且是解包后的。

我们再用if else语句写一个类似的方法:

func checkupUseIf(person: [String: String!]) {         if let id = person["id"], let examNumber = person["examNumber"] {        print("您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!")    } else {        print("证件不齐全,不能进入考场!")    }         print("您的身份证号为:\(id),准考证号为:\(examNumber)")  // 报异常     } checkupUseIf(["id": "123456"]) // 证件不齐全,不能进入考场!checkupUseIf(["examNumber": "654321"]) // 证件不齐全,不能进入考场!checkupUseIf(["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!

我们可以看到用if else实现的方法显然不如guard实现的那么精准。而且idexamNumber的作用域只限在if的第一个大括号内,超出这个作用域编译就会报错。

 

本项目中关于Timer的部分源码:

var result: UILabel!    var timer:Timer!    var lableNumber:Double = 0    @objc func startHandler(){        if self.timer != nil {            self.stopHandler()        }        //每隔0.1秒刷新lableNumber的数值        self.timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (Timer) in            self.lableNumber = self.lableNumber + 0.1            self.result.text = String(format: "%.1f", self.lableNumber)        }        //启动定时器        self.timer.fire()    }        @objc func stopHandler(){        guard let timerForDistory = self.timer else {            return        }        //消除定时器        timerForDistory.invalidate()    }

 

学习源码来自  ,其Swift语言版本为 4.1 。

学习过程我会将代码语言版本改成Swift 5,代码地址: 。

 

参考文章:

               

转载于:https://my.oschina.net/dong706/blog/3048542

你可能感兴趣的文章
深入理解Lock
查看>>
vim的块选择
查看>>
HTML --块
查看>>
一个不错的loading效果
查看>>
Debian允许root用户登录
查看>>
linux的文件系统
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>
袋鼠云服务案例系列 | 从DB2到MySQL,某传统金融平台的互联网转型之路
查看>>
RealServer配置脚本
查看>>
九月份技术指标 华为交换机的简单配置
查看>>
python 写json格式字符串到文件
查看>>
分布式文件系统MogileFS
查看>>
Java23种设计模式案例:策略模式(strategy)
查看>>
XML解析之DOM4J
查看>>
图解微服务架构演进
查看>>
SQL PATINDEX 详解
查看>>
一些常用的网络命令
查看>>
CSP -- 运营商内容劫持(广告)的终结者
查看>>
DIV+CSS命名规范有助于SEO
查看>>
web项目buildPath与lib的区别
查看>>