2016-06-06 7388
作者:Olivier Halligon,原文链接,原文日期:2016-05-16
译者:walkingway;校对:Cee;定稿:numbbbbb
现在我们来重新回顾下前三弹模式匹配的各种语法 第一弹,第二弹,第三弹,第四弹是本系列的最后一篇文章,本章会教大家使用 if case let,for case where 等一些高级语法,让我们拭目以待吧!
本篇文章会结合本系列前三篇文章提到的语法,然后将它们应用在一些更先进表达式中。
这篇文章是模式匹配系列文章的最后一部分,你可以在这里阅读所有内容:第一弹,第二弹,第三弹,第四弹
if case let
语句 case let x = y 模式允许你检查 y 是否能匹配 x。
而 if case let x = y { … } 严格等同于 switch y { case let x: … }:当你只想与一条 case 匹配时,这种更紧凑的语法尤其有用。有多个 case 时更适合使用 switch。
例如,我们有一个与之前文章类似的枚举数组:
casecasecase然后我们可以这样写:
m = Media.Movie(title: , director: , year: )
Media.Movie(title, , ) = m {
print"This is a movie named \(title)"改用 switch 后更冗长的版本:
m {
caselet__print"This is a movie named \(title)"default// do nothing, but this is mandatory as all switch in Swift must be exhaustive
if case let where
我们当然还可以将 if case let 和 where 从句组合在一起用:
Media.Movie(, , year) = m year < {
print"Something seems wrong: the movie's year is before the first movie ever made."这种方式可以组合成一个相当强大的表达式,而改用 switch 实现可能会变得非常复杂,需要写很多行代码来检测那一个特定的 case。
guard case let
当然,guard case let 类似于 if case let,你可以使用 guard case let 和 guard case let … where … 来确保匹配一个模式或一个条件,而当无法匹配模式或满足条件时就退出。
casecase
(response: NetworkResponse)guardcaseletletaswhere200300elseprint"Invalid response, can't process"return
}
print"Processing \(data.length) bytes…"/* … */
for case
将 for 和 case 组合在一起也能让你有条件地遍历一个集合对象。使用 for case … 语义上类似于 for 循环,而且将它整个循环体封装在了 if case 的结构之中:它只会遍历、处理那些模式匹配了的元素。
mediaList: [Media] = [
"Harry Potter and the Philosopher's Stone""J.K. Rowling"1997"Harry Potter and the Philosopher's Stone""Chris Columbus"2001"Harry Potter and the Chamber of Secrets""J.K. Rowling"1999"Harry Potter and the Chamber of Secrets""Chris Columbus"2002"Harry Potter and the Prisoner of Azkaban""J.K. Rowling"1999"Harry Potter and the Prisoner of Azkaban""Alfonso Cuarón"2004"J.K. Rowling: A Year in the Life""James Runcie"2007"https://en.wikipedia.org/wiki/List_of_Harry_Potter-related_topics"
()
Media.Movie(title, , year) mediaList {
print" - \(title) (\(year))"
- Harry Potter and the Philosopher's Stone (2001)
- Harry Potter and the Chamber of Secrets (2002)
- Harry Potter and the Prisoner of Azkaban (2004)
- J.K. Rowling: A Year in the Life (2007)
for case where
为 for case 增加一个 where 从句,能使其变得更加强大:
()
Media.Movie(title, director, year) mediaList director == {
print" - \(title) (\(year))"
- Harry Potter and the Philosopher's Stone (2001)
- Harry Potter and the Chamber of Secrets (2002)
- erlang判断语法结构:if/case/guard
erlang 有好几种常用的判断结构语句,如 if.case.guard 等.文章将分别对 if / case /guard 的特点做介绍,以及用例说明 1.if 结构 if Condition 1 ...
- CASE WHEN 及 SELECT CASE WHEN的用法(转)
Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- CASE WHEN 及 SELECT CASE WHEN的用法
CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WH ...
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- CASE WHEN 及 SELECT CASE WHEN的用法(写了一坨烂代码发现两条sql就行了, 哎)
转自:http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE ...
- 【转载】CASE WHEN 及 SELECT CASE WHEN的用法
原文链接:https://www.cnblogs.com/aipan/p/7770611.html Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WH ...
- 前端学习 第四弹: HTML(一)
前端学习 第四弹: HTML(一) 元素分类:块元素 内联元素 块级元素在浏览器显示时,通常会以新行来开始(和结束). 例子:<h1>, <p>, <ul>, &l ...
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
随机推荐
- NoSQL数据库概览及其与SQL语法的比較
[文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...
- SP2-0734: 未知的命令开头 "imp scott/..." - 忽略了剩余的行。
Oracle数据导入报错:SP2-0734: 未知的命令开头 "imp scott/..." - 忽略了剩余的行. 原因:进入sqlplus里是不能运行imp的(sqlplus不认 ...
- restlet 2.3.5 org.restlet包导入eclipse出现的com.sun.net.httpserver类包找不到问题
准备过一遍restlet 2.3.5 JavaEE的源码. 环境 eclipse3.7.2 和 jdk 7.0 将org.restlet 包增加到eclipse中.出现 com.sun.net.htt ...
- web 开发之js---js 实现文本高亮
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head ...
- 实现一个简易的express中间件
代码: // 通过闭包实现单例 const Middlewave = (function(){ let instance; class Middlewave{ constructor() { this ...
- charset='utf8mb4'
charset='utf8mb4' conn = pymysql.connect(host=h, port=pt, user=u, passwd=p, db=db, charset='utf8mb4' ...
- ios24--改变button的文字和图片
// // ViewController.m // 09-UIButton内部子控件的调整 // // Created by xiaomage on 15/12/30. // Copyright © ...
- JavaScript倒计时类
(function (){ var jtimer = function() { // init if(arguments.length >= 1) { this.setEndTime(argum ...
- 【Poj1017】Packets
http://poj.org/problem?id=1017 艰难啊 弄了很久咧 拍了几十万组,以后拍要多组数据 Solution 从大wangxiaofang 从大往小放,有空余的从大往小填 注意细 ...
- ModuleNotFoundError: No module named 'urlparse'
这是2.x转3.x问题 2.x写法: from urlparse import urlparse 3.x写法: from urllib.parse import urlparse 问题解决.
| | | | | | |