当前位置: 首页 > news >正文

【30-swift-projects-in-30-days】swift 5 学习 02.Watch'sDemo

2019独角兽企业重金招聘Python工程师标准>>> 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 Date
timer.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()
    }

 

学习源码来自 https://github.com/nimomeng/30-swift-projects-in-30-days ,其Swift语言版本为 4.1 。

学习过程我会将代码语言版本改成Swift 5,代码地址:https://github.com/dong706/30-swift-projects-in-30-days/ 。

 

参考文章:swift Timer的一些简单用法

               Swift - guard关键字(守护)

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

相关文章:

  • 【phonegap】下载文件
  • DES算法总结
  • 基于C 的libvirt 接口调用
  • python基础知识~元组,range和字典
  • 【ios】UITableView中的uitablviewcell在64位下显示重叠问题
  • Python生物学 Python for Bioinformatics 2nd - 2018.pdf
  • 服务发现系统consul-health check
  • 数据类型与运算符小结(JAVA)
  • redis的复制
  • 人工智能 + 物联网 = 智慧物联网
  • extjs Date的使用
  • rocketmq-producer
  • 谈谈javascript语法里一些难点问题(一)
  • 火箭还是飞机?——DevOps 的两种模式
  • linux下smb打印服务器部署过程(对windows终端)
  • hexo+github搭建个人博客
  • 《剑指offer》分解让复杂问题更简单
  • Angular 4.x 动态创建组件
  • Docker: 容器互访的三种方式
  • eclipse(luna)创建web工程
  • ES6--对象的扩展
  • input的行数自动增减
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java 内存分配及垃圾回收机制初探
  • java2019面试题北京
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux快速复制或删除大量小文件
  • PAT A1050
  • Protobuf3语言指南
  • Swift 中的尾递归和蹦床
  • vue-cli3搭建项目
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 近期前端发展计划
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 我看到的前端
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #Linux(权限管理)
  • #Spring-boot高级
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (3)nginx 配置(nginx.conf)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (python)数据结构---字典
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)关于多人操作数据的处理策略
  • (转载)从 Java 代码到 Java 堆
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net mvc 获取url中controller和action
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET成年了,然后呢?
  • .net打印*三角形