Swift流程控制之循环语句和判断语句详解剖析
Swift流程控制之循环语句和判断语句详解Swift提供了所有c类语言的控制流结构。
包括for和while循环来执行一个任务多次;if和switc h语句来执行确定的条件下不同的分支的代码;break和continue关键字能将运行流程转到你代码的另一个点上。
除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历a rrays, dictionaries, ranges, strings等其他序列类型。
Swift的switch语句也比C语言的要强大很多。
Swift中switch语句的case语句不会“掉入”下一个case,避免了c语言忘记写break语句产生的错误。
case可以匹配许多不同的模式,包括范围匹配,元组匹配或者抛给指定的类型。
匹配值在一个case条件下可以绑定到临时常量或变量,可以在case的代码块中使用,复杂匹配条件下可以表示为每一个case的条件一、For Loops - For循环for循环用来多次执行一组语句,Swift提供了两种形式:1.for-in执行范围,序列,集合或级数等每一项中的一组语句2.for-condition-increment执行一组语句直到确定的条件出现,通常在每一个循环结束前递增一个计数For-In循环使用for-in来遍历集合中的项目,比如数组的范围,排列中的项或者字符串中的字符。
下面的例子打印了表中的5个元素复制代码代码如下:for index in 1...5 {println("\(index) times 5 is \(index * 5)")}// 1 times 5 is 5// 2 times 5 is 10// 3 times 5 is 15// 4 times 5 is 20// 5 times 5 is 25例子中被迭代集合的项是一个封闭范围内从1到5的数字,就是上面标识为封闭范围操作符的 (...)。
Index的值被设为第一个数据的范围(1), 然后执行循环中的语句。
在本例中,循环只包含了一句话,根据index现有的值打印5次乘法表的一个结果。
当执行完语句之后,index的值被更新为范围中的第二个值,然后再次调用println函数。
这个操作会一直持续,直到范围的终点。
在上面的例子中,index是一个常量,它的值在每次迭代的开始时自动初始化,使用前不会被声明,就是简单的将其隐性声明纳入循环的声明,不需要使用let来声明关键字。
复制代码代码如下:NOTE:Index常量仅仅存在于循环的范围内。
如果你想要在循环之后得到index的值,或者想要使用index 的值作为变量,你必须在循环之前声明它。
如果不需要范围的值,可以用下划线替代变量名来忽略这些值:复制代码代码如下:let base = 3let power = 10var answer = 1for _ in 1...power {answer *= base}println("\(base) to the power of \(power) is \(answer)")// prints "3 to the power of 10 is 59049"例子中计算两数相乘(在本例中,3乘以10)。
乘法初始值为1,每次乘3,乘10次,使用半封闭循环从0到9。
这个计算不需要通过循环来知道每个计数器的值--仅仅只需要执行正确的循环次数。
下划线操作符 _ (用于替代循环变量)将忽略掉个体值,并且在每一次循环迭代期间不给现有的变量提供访问。
使用for-in循环来迭代出array中的每一个项:复制代码代码如下:let names = ["Anna", "Alex", "Brian", "Jack"]for name in names {println("Hello, \(name)!")}// Hello, Anna!// Hello, Alex!// Hello, Brian!// Hello, Jack!同样可以迭代字典来访问其中的键值对。
当迭代字典时里面的每一个项都以(key,value)元组的形式来返回,你可以在for-in的循环体中分解 (key, value) 元组的成员,把成员作为显性命名的常量来使用。
下面例子,字典的key被分解为animalName的常量,字典的值被分解名为legCount的常量:复制代码代码如下:let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]for (animalName, legCount) in numberOfLegs {println("\(animalName)s have \(legCount) legs")}// spiders have 8 legs// ants have 6 legs// cats have 4 legsDictionary中的项的迭代顺序可能跟它们插入时的顺序不一样。
因为Dictionary中的内容本质上是无序的,所以迭代它们不能保证检索时的顺序。
更多关于排列和字典的内容详见Collection Types 章节。
除了排列和字典,for-in循环还能迭代字符串中的Character(字符):复制代码代码如下:for character in "Hello" {println(character)}// H// e// l// l// oFor-Condition-Increment For-条件-递增除了for-in循环,Swift还支持传统C语言按条件递增的for循环复制代码代码如下:for var index = 0; index < 3; ++index {println("index is \(index)")}// index is 0// index is 1// index is 2这是常用的形式:复制代码代码如下:for <initialization>; <condition>; <increment> {<statements>}封号把循环定义隔为了三个部分,跟C语言一样。
然而与C不同的是,Swift不需要用括号把“初始化; 条件; 增量”的代码块包起来。
循环按照下面流程执行:1.当循环第一次进入,initialization expression(初始化表达式)计算一次,设置好循环所需的常量或者变量。
2.计算condition expression(条件表达式)。
如果计算结果为false(假),循环终止,并继续执行for循环尾括号(})后面的代码。
如果结果为(true)真,则执行循环体大括号内的代码。
3.在所有的语句执行完后,计算increment expression(增量表达式)。
计数器可能递增或递减,也可能根据语句执行的结果将初始化变量设为新的值。
计算完增量表达式返回到第2步,条件表达式再次被计算。
上面描述的循环体的形式和执行过程可以简单的等同于:复制代码代码如下:<initialization>while <condition> {<statements><increment>}常量和变量在初始化表达式中的声明(比如var index = 0)只在for循环自己内部有效。
如果需要知道index最终的值,必须在循环开始前声明index:复制代码代码如下:var index: Intfor index = 0; index < 3; ++index {println("index is \(index)")}// index is 0// index is 1// index is 2println("The loop statements were executed \(index) times")// prints "The loop statements were executed 3 times"注意,循环完成后index最终的值是3,不是2。
最后一次执行增量表达式调用了++index,把index 设为3,使得index<3等于false,循环结束。
二、While Loops - While循环while循环在条件变为false前执行一组语句,这类循环最好用在第一个迭代开始前并不知道迭代器的数字的时候。
Swift提供了两种while循环:1.while 在每次通过循环的开头计算条件2.do-while 在每次通过循环的结尾计算条件while循环一个while循环开始于计算单个的条件,如果条件为true,一组语句将重复直到条件变为false。
这是常见的while形式:复制代码代码如下:while <condition> {<statements>}比如,玩这个叫Snakes and Ladders的游戏(或Chutes and Ladders):游戏的规则是这样的:1.板子上有25个矩形,然后目标是到达或超越25号方块。
2.每一轮,你先摇六面骰子,然后按照水平方向的虚线箭头移动到对应数字的方块上。
3.如果走完落在梯子的底部,你可以爬上梯子。
4.如果走完落在蛇的头部,你可以走到那条蛇的尾部。
这个游戏板由一个Int型数组展示出来。
它的大小基于finalSquare常量,该常量用来初始化数组并在之后检查胜利条件。
游戏板初始化为26个值为0的Int型数据,不是25个(分别位于0至25的索引):复制代码代码如下:let finalSquare = 25var board = Int一些方块给蛇与梯子设有具体的值。
游戏板里,你能在有方块有梯子脚的地方向上移动正数,而有蛇头的地方你只能向下移动负数:复制代码代码如下:board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08方块3有梯子脚,所以你可以移动到方块11。
为了表述这个动作,board[03]等于+08,等同于一个整型数值8(即3和11的差)。
Swift基础语法学习总结
Swift基础语法学习总结1.基础1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释.1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的.1.3) swift在语句后面加分号与否都是正确的,但是swift偏好的风格是不在结尾处加分号的.如果有多个语句,必须用分号隔开.1.4) 在一个数字中庸下划线(_)会被忽视,方便认出大数值的的数字,也可以在前面补零.1.5) swift不允许在不同种类型间做加减乘除,要先做类型转换或运算符重载.1.6) typealias 可以为一个类型指定另外一个名字,这样可以清晰的表达类型的意义.typealiasnewType = OldTypeName1.7) assert 断言表示自己抛出异常,assert 第一个参数表示通过而不抛异常的条件,第二个参数表示提示,第二个参数可以没有1.8) swift中的 = 赋值运算符没有返回值,所以不会犯 if a = 3 {}这样的错误了,运算符前后加空格,以免xcode不能识别2.变量2.1) let 定义常量,var 定义变量,let定义的必须在声明时指定初始值,普通的var声明也必须赋初始值.2.2) let 声明的变量不可再改变,而var变量可以再改变,但是你不能再声明一个已经声明的常量或变量.2.3) 可以在一行同时声明多个常量或变量,用逗号隔开;如果每个常量对应一个var或let只需要用分号隔开即可.2.4) 每个常量和变量都一定会有固定的类型,如果没有指定类型,swift会根据后面的赋值类型来推断.2.5) swift的命名不能使用保留字和箭头/开头不能用数字,没有其它任何规定,甚至都可以使用小狗小猫命名.2.6) 如果你想使用关键字来命名是不允许的,但是你可以在前后加上``来命名,比如`let`,非关键字加``命名也可以的.2.7) swift里可以声明元组,类型类似于(Int, String),你可以用var声明也可以用let声明,里面两个都会是变量或者常量2.8) 而元组的方式和直接分开声明两个变量和常量没多大区别,你可以把其中的变量拿出来单独用或当元组用,混合用也可以.2.9) 可以用元组名直接通过下标索引直接来访问元组里对应的值,比如aaa.0 aaa.12.10) 你可以在元组中跟元素命名,比如(code:404,message:"Not Found"),然后你就可以用aaa.code 和 aaa.message来访问3.类型3.1) int型的UInt8和Int32 都可以通过min和max来取最大值和最小值3.2) Double是64位浮点数,Float是32位浮点数,对小数自动推断是Double类型,除非是指定过类型的3.3) 可以跟指定为浮点类型的常量或变量赋一个整数值但是不能是整数变量,它会自动转换成浮点数.3.4) 显示指定类型的变量或常量不能跟它赋值一个不同类型的值,它不能做自动转换,除了跟浮点类型赋值一个整数数值3.5) 在指定类型后加一个?表示可选类型,它的意思是它可能为没有值为nil,然后你可以通过可选绑定或者判断是否为空来使用它.3.6) 如果是一个class的可选类型,你可以通过?.访问它的属性和方法,它是通过前者是否会相应后面的方法,如果能响应则执行,不能则返回nil3.7) ?其实是个语法糖,比如String?类型等价于Optional<String>类型,只是方便写而已,他和String类型本质是不同的3.8) 如果你不想用判断是否为空或者用可选绑定或者用.?来访问它,你可以用最直接最简单的!强制解包来使用,但前提是能保证非空3.9) 如果一个可选量没有值又强制解包会报错,一个可选类型会隐式赋值为nil,你也可以在使用中赋值为nil3.10) 之所以需要有可选类型是因为swift是类型绝对安全的语言,它需要你在使用变量时一定有值,但是这种可选类型太麻烦,所以产生了!类型,!类型本质应该就是可选类型3.11) 声明为!可选类型,也可以不做初始化,它相当于你在每次使用可选类型的时候加上了!进行强制解包,你就不需要再自己加!了,你需要自己保证它不为空,否则使用会出错4.字符串4.1) ... 表示闭区间/ ..< 表示开区间, == 表示值相等/=== 表示引用相同, + 可以直接加字符串或数组4.2) swift中的string是值类型,它在做常量变量赋值或函数中进行传递时都会做值拷贝,都是一个新的副本,swift只有在必要的情况下做拷贝4.3) 可以用for in 遍历字符串,用 count全局函数计算字符数,用isEmpty属性判断是否是空字符串,有hasPrefix判断前缀(后缀等)4.4) 可以用startIndex和endIndex获取开始和结束下标,用数组和下标的形式访问单个字符;还可以通过\()的方式生成字符串5.数组5.1) swift中的数组可以用[String]和Array<String>来声明,它们是同一个意思,赋值也直接用中括号[]表示就可以了,里面的值需要是同一个类型5.2) array 有count/isEmpty等属性,有append/insert/remove等方法,它可以直接 + 一个数组,它可以通过下标和下标区间来取值,区间取到的是一个数组5.3) for item in shoppingList / for (index, value) inenumerate(shoppingList) 两种遍历方式,后面一种会知道下标5.4) 可以通过[Double](count: 3, repeatedValue: 3.3) / Array(count: 3, repeatedValue: 2.5) 初始化一个数组5.5) 数组也是值传递,如果把数组a赋值给数组b,a和b就是两份拷贝,修改相互不会有影响6.字典6.1) 字典是通过 [String : String] / Dictionary<String, String> 声明的,形式也是用[a:b,c:d]这种形式,通过键访问值6.2) 可以直接通过a[b] = c 这种方式增加一个键值对,通过updateValue 和removeValueForKey来增加删除键值对6.3) 可以用for (airportCode, airportName) in airports / for airportCode in airports.keys 遍历键值对或键或值6.4) 可以直接赋值 [:] 来清空字典,键值是可以为Int的;和string,array一样,dictionary也是值拷贝7.Set7.1) 用Set<Int> 声明Set,和数组一模一样跟它赋值,也可以通过赋值[]清除,也必须是同一类型,也有insert/contains方法,isEmpty属性7.2) Set也有for in 遍历,有取两个集合的差交等做做排列的方法,也有判断子集超集等方法8.For循环8.1) for index in 1...5 的这个index只是在当前这个循环的作用域内,如果for循环外面也有一个index,随便修改也不会和它又什么影响8.2) for _ in 1...10 如果不需要循环的这个索引可以用下划线_代替,在swift中只要不需要那个值的一般都可以用_代替8.3) for var index = 0; index < 3; ++index 这种for循环也还是可以的9.Switch语句9.1) swift 中的switch必须穷举所有的可能,否则必须加default,穷举的时候在一个case后面可以放很多可能值,用逗号隔开就好9.2) 穷举可以是用...和..<表示的一个区间,对于元组可以一个用_通配符,另一个匹配,或者两个都匹配,或者两个都是区间(只有一个元素也可以做值绑定)9.3) 做统配的时候可以用var x/let x,或 let (x,y) 进行值绑定,其中var 声明的可以修改9.4) 当做let 做值绑定的时候可以在后面加上 where做条件判断.switch 不需要用break防止穿透,但是它还是会去下一个case判断条件去匹配,使用break还是可以直接跳出switch9.5) 在switch同样可以使用break/continue跳出一个标签。
C语言的循环结构和循环控制语句
C语言的循环结构和循环控制语句C语言作为一种高级编程语言,具有强大的功能和灵活的语法结构。
其中,循环结构和循环控制语句是C语言中非常重要的概念和特性。
通过循环结构和循环控制语句,程序员可以有效地控制程序的执行流程,实现重复执行某段代码的目的。
一、循环结构的概念和作用循环结构是一种程序设计中常用的结构,用于重复执行某段代码,直到满足某个条件才停止。
循环结构可以大大简化代码的编写,提高程序的效率。
在C语言中,主要有三种循环结构:while循环、do-while循环和for循环。
1. while循环while循环是最基本的循环结构,它的语法形式如下:```while (条件) {// 循环体}```在执行while循环时,首先判断条件是否满足,如果满足则执行循环体中的代码,然后再次判断条件是否满足,如此循环,直到条件不满足时跳出循环。
2. do-while循环do-while循环与while循环类似,不同之处在于它先执行一次循环体中的代码,然后再判断条件是否满足。
do-while循环的语法形式如下:```do {// 循环体} while (条件);```do-while循环适合于需要至少执行一次循环体的情况。
3. for循环for循环是一种更加灵活和简洁的循环结构,它的语法形式如下:```for (初始化; 条件; 更新) {// 循环体}```for循环中的初始化部分用于初始化循环变量,条件部分用于判断是否继续执行循环,更新部分用于更新循环变量的值。
for循环适合于已知循环次数的情况。
二、循环控制语句的使用循环控制语句是用于控制循环结构的执行流程的语句,主要包括break语句和continue语句。
1. break语句break语句用于在循环中提前结束循环,跳出循环体。
当满足某个条件时,可以使用break语句跳出循环,继续执行循环后面的代码。
例如,在一个循环中查找某个元素时,如果找到了该元素,就可以使用break语句跳出循环。
Swift语言编程入门指南
Swift语言编程入门指南随着移动应用的飞速发展,编程也越来越受到人们的关注。
现在,很多人想学习编程,但是不知道从哪里开始。
如果你的目标是成为一个iOS开发者,那么Swift语言是一个你非常值得学习的编程语言。
Swift语言是由苹果公司推出的一门开发iOS应用的编程语言,自2014年发布以来,得到了广泛的关注和使用。
在这篇文章中,我将为大家介绍Swift语言的基础知识和编程入门指南。
Swift语言的特点1. 快速与安全:Swift编译器采用了现代编程语言中最先进的编译技术,因此编译速度很快。
同时,Swift语言还具有更安全的编程环境,可以避免一些常见的编程错误。
2. 简单易学:Swift语言的语法和C语言类似,非常容易学习。
与Objective-C相比,Swift语言更加简洁明了,代码更加易于维护。
3. 现代化:Swift语言在设计时考虑到了现代编程语言的最佳实践和编程模式,如面向对象编程、函数式编程等。
4. 开源:Swift语言是一个开源项目,与全球的开发者们一起共同发展和完善。
学习Swift语言的步骤1. 了解Swift语言的基础知识:在开始编写Swift代码之前,你需要掌握Swift语言的基本语法和数据类型等基础知识。
下面是Swift语言的一些基本概念:(1)变量和常量:Swift语言中的变量使用var来定义,常量使用let来定义。
(2)数据类型:Swift语言支持多种数据类型,包括整型、浮点型、布尔型、字符串等。
(3)控制流:Swift语言支持if语句、switch语句、for循环、while循环等控制流语句。
(4)函数:Swift语言支持函数式编程,函数是一个独立的模块,可以被多次调用。
2. 下载并安装Xcode:Xcode是苹果公司官方推出的一款综合性开发工具,包括Swift编译器、调试工具、界面设计器等。
你需要在Apple Store中下载并安装Xcode才能编写Swift代码。
3. 学习Swift语言的API:Swift语言提供了一些重要的API,如UIKit、Foundation等,它们提供了一些常用的函数和类。
Swift编程语言中文教程介绍
目录
隐藏
1 简单的赋值
2 流程控制 2.1 if 2.2 switch 2.3 for-in 2.4 while
3 函数与闭包 4 类和对象 5 枚举与结构 6 接口和扩展
7 泛型
简单的赋值
使用 let 来定义常量, var 定义变量。常量的值无需在编译时指定,但是至少要赋值一次。这意味着你可以使用常量 来命名一个值,你发现只需一次定义,多个地方使用。 varmyVariable = 42 myVariable = 50 letmyConstant = 42 一个常量或变量必须与赋值时拥有相同的类型。因此你不用严格定义类型。提供一个值就可以创建常量或变量,并让编 译器推断其类型。在上面例子中,编译其会推断 myVariable 是一个整数类型,因为其初始化值就是个整数。 如果初始化值没有提供足够的信息(或没有初始化值),可以在变量名后写类型,以冒号分隔。 letimplicitInteger = 70 letimplicitDouble = 70.0 letexplicitDouble: Double = 70 练习: 创建一个常量,类型为 Float,值为4 值永远不会隐式转换为另一种类型。如果你需要把一个值转换到不同类型,需要明确的构造一个所需类型的实例。 letlabel = "The width is " letwidth = 94 letwidthLabel = label + String(width) 练习: 尝试删除最后一行的 String 转换,你会得到什么错误?
} } largest 练习: 添加另一个变量来跟踪哪个种类中的数字最大,也就是最大的数字所在的
while
使用 while 来重复执行代码块直到条件改变。循环的条件可以放在末尾来确保循环至少执行一次。 varn = 2 while n < 100 { n = n * 2 } n varm = 2 do{ m = m * 2 }while m < 100 m 你可以在循环中保持一个索引,通过 ".." 来表示索引范围或明确声明一个初始值、条件、增量。这两个循环做相同的 事情: varfirstForLoop = 0 fori in 0..3 { firstForLoop += i } firstForLoop varsecondForLoop = 0 forvari = 0; i < 3; ++i { secondForLoop += 1 } secondForLoop 使用 .. 构造范围忽略最高值,而用 ... 构造的范围则包含两个值。
swift系统的运行机制
swift系统的运行机制Swift是苹果公司推出的一种新型编程语言,它支持iOS、macOS、watchOS以及tvOS等平台的开发。
Swift系统的运行机制是指Swift语言在编译、运行和优化代码时所采用的方式和过程。
Swift语言的编译方式采用了LLVM编译器,它是一种开放源代码的编译器框架,能够将高级语言代码编译成目标机器的特定指令集。
在Swift语言中,编译器会将源代码转换为中间代码,然后再将中间代码编译成机器码,最终生成可执行文件。
Swift语言的运行机制主要是指它在运行时所采用的方式。
Swift语言采用了一种基于ARC(自动引用计数)的内存管理方式,这意味着开发者无需手动管理内存,而是由编译器自动在运行时进行内存分配和回收。
这种内存管理方式不仅简化了开发流程,同时也提高了应用程序的性能和稳定性。
在Swift语言中,还采用了一种叫做Optional的特殊类型,它可以表示一个值可能存在,也可能不存在。
这种类型的引入,可以避免空指针引用等问题,提高了代码的健壮性和可维护性。
Swift语言还支持面向对象编程、函数式编程和协议扩展等多种编程范式,这为开发者提供了更多的编程选择和灵活性。
同时,Swift语言还支持泛型编程,可以让开发者编写出更加通用、灵活的代码。
Swift语言的优化方式也值得一提。
在编译过程中,Swift编译器会进行多种优化,如死代码删除、常量折叠、循环展开等,以提高代码的执行效率。
此外,Swift编译器还支持Just-In-Time编译(JIT),可以在程序运行时对一些热点代码进行编译和优化,进一步提高代码执行效率。
Swift语言的运行机制是一系列复杂的过程和策略的组合,它们共同保证了Swift应用程序的高效、稳定、健壮和易于维护。
了解Swift 语言的运行机制,有助于开发者更好地理解和应用Swift语言,开发出更加高效、优秀的应用程序。
Swift 的基本语法
Swift 的基本语法1.基本语法1.1变量和常量:1.1.1定义let 定义常量,一旦赋值不允许再修改.Var定义变量,赋值之后仍然可以修改.1.1.2自动推导:swift能够根据右边的代码,推导出变量的类型通常在开发的时候不需要指定变量类型如果需要指定变量类型,可以在变量名后使用:,然后跟上变量的类型1.1.3 没有隐式转换swift 对数据类型要求严格任何时候,都不允许做隐式转换1.1.4 let 和var 的选择应该尽量先选择常量,只有在必须修改时,才修改为var在xcode7.0中,如果没有修改变量, xcode 会提示修改为let1.2 Optional 可选项1.2.1Optional 是Swift 的一大特色,也是Swift 初学者最容易困惑的问题定义变量时,如果指定是可选的,表示该变量可以有一个指定类型的值,也可以是nil定义变量时,在类型后面添加一个?,表示该变量是可选的变量可选项的默认值是nil常量可选项没有默认值,主要用于在构造函数中给常量设置初始数值如果Optional 值是nil,不允许参与计算,只有解包(unwrap)后才能参与计算,在变量后添加一个!,可以强行解包1.2.2常见错误unexpectedly found nil while unwrapping an Optional value1.2.3 ??运算符?? 运算符可以用于判断变量/常量的数值是否是nil,如果是则使用后面的值替代在使用Swift 开发时,?? 能够简化代码的编写1.3 控制流1.3.1 ifSwift 中没有C 语言中的非零即真概念在逻辑判断时必须显示地指明具体的判断条件true / false,if 语句条件的() 可以省略,但是{}不能省略1.3.2 三目运算Swift 中的三目运算保持了和OC 一致的风格1.3.3 可选项判断由于可选项的内容可能为nil,而一旦为nil 则不允许参与计算因此在实际开发中,经常需要判断可选项的内容是否为nil单个可选项判断用if条件判断小结:if let 不能与使用&&、|| 等条件判断如果要增加条件,可以使用where 子句注意:where 子句没有智能提示多个可选项判断用,同时判断多个可选项,判断之后要对可选项进行修改guardguard 是与if let 相反的语法,Swift 2.0 推出在程序编写时,条件检测之后的代码相对是比较复杂的使用guard 的好处能够判断每一个值在真正的代码逻辑部分,省略了一层嵌套1.3.4switchswitch 不再局限于整数switch 可以针对任意数据类型进行判断不再需要break每一个case后面必须有可以执行的语句要保证处理所有可能的情况,不然编译器直接报错,不处理的条件可以放在default 分支中每一个case 中定义的变量仅在当前case中有效,而OC 中需要使用{}1.4 循环oc 风格for – in 0..<10 表示0到9范围0…10 表示0到101.5 字符串在Swift 中绝大多数的情况下,推荐使用String 类型String 是一个结构体,性能更高String 目前具有了绝大多数NSString 的功能String 支持直接遍历NSString 是一个OC 对象,性能略差Swift 提供了String 和NSString 之间的无缝转换字符串拼接直接在"" 中使用\(变量名) 的方式可以快速拼接字符串可选项的拼接如果变量是可选项,拼接的结果中会有Optional为了应对强行解包存在的风险,苹果提供了?? 操作符?? 操作符用于检测可选项是否为nil如果不是nil,使用当前值如果是nil,使用后面的值替代String & Range 的结合在Swift 中,String 和Range连用时,语法结构比较复杂如果不习惯Swift 的语法,可以将字符串转换成NSString 再处理1.6 集合1.6.1数组定义使用[]定义,for in 遍历下标获取内容, let 定义的为不可变数组, var定义的为可变数组数组的类型如果初始化时,所有内容类型一致,择数组中保存的是该类型的内容如果初始化时,所有内容类型不一致,择数组中保存的是NSObject数组的定义和实例化使用: 可以只定义数组的类型实例化之前不允许添加值使用[类型]() 可以实例化一个空的数组数组的合并必须是相同类型的数组才能够合并开发中,通常数组中保存的对象类型都是一样的!1.6.2字典•定义同样使用[] 定义字典let 不可变字典var 可变字典[String : NSObject] 是最常用的字典类型//: [String : NSObject] 是最常用的字典类型var dict = ["name": "zhangsan", "age": 18]•赋值◦赋值直接使用dict[key] = value 格式◦如果key 不存在,会设置新值◦如果key 存在,会覆盖现有值//: * 如果key 不存在,会设置新值dict["title"] = "boss"//: * 如果key 存在,会覆盖现有值dict["name"] = "lisi"dict•遍历◦k,v 可以随便写◦前面的是key◦后面的是value//: 遍历for (k, v) in dict {print("\(k) ~~~ \(v)")}•合并字典◦如果key 不存在,会建立新值,否则会覆盖现有值//: 合并字典var dict1 = [String: NSObject]()dict1["nickname"] = "大老虎"dict1["age"] = 100//: 如果key 不存在,会建立新值,否则会覆盖现有值for (k, v) in dict1 {dict[k] = v}print(dict)2函数目标•掌握函数的定义•掌握外部参数的用处•掌握无返回类型的三种函数定义方式代码实现•函数的定义◦格式func 函数名(行参列表) ->返回值{代码实现}◦调用let result = 函数名(值1, 参数2: 值2...)func sum(a: Int, b: Int) -> Int {return a + b}let result = sum(10, b: 20)•没有返回值的函数,一共有三种写法◦省略◦()◦Voidfunc demo(str: String) -> Void {print(str)}func demo1(str: String) -> () {print(str)}func demo2(str: String) {print(str)}demo("hello")demo1("hello world")demo2("olleh")•外部参数◦在形参名前再增加一个外部参数名,能够方便调用人员更好地理解函数的语义◦格式:func 函数名(外部参数名形式参数名: 形式参数类型) ->返回值类型{ // 代码实现}◦Swift 2.0 中,默认第一个参数名省略func sum1(num1 a: Int, num2 b: Int) -> Int {return a + b}sum1(num1: 10, num2: 20)闭包与OC 中的Block 类似,闭包主要用于异步操作执行完成后的代码回调,网络访问结果以参数的形式传递给调用方目标•掌握闭包的定义•掌握闭包的概念和用法•了解尾随闭包的写法•掌握解除循环引用的方法OC 中Block 概念回顾•闭包类似于OC 中的Block◦预先定义好的代码◦在需要时执行◦可以当作参数传递◦可以有返回值包含self 时需要注意循环引用闭包的定义•定义一个函数//: 定义一个sum 函数func sum(num1 num1: Int, num2: Int) -> Int {return num1 + num2}sum(num1: 10, num2: 30)//: 在Swift 中函数本身就可以当作参数被定义和传递let mySum = sumlet result = mySum(num1: 20, num2: 30)•定义一个闭包◦闭包= { (行参) ->返回值in // 代码实现}◦in 用于区分函数定义和代码实现//: 闭包= { (行参) ->返回值in // 代码实现}let sumFunc = { (num1 x: Int, num2 y: Int) -> Int inreturn x + y}sumFunc(num1: 10, num2: 20)•最简单的闭包,如果没有参数/返回值,则参数/返回值/in 统统都可以省略◦{ 代码实现}let demoFunc = {print("hello")}基本使用GCD 异步•模拟在后台线程加载数据func loadData() {dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void inprint("耗时操作\(NSThread .currentThread())") })}•尾随闭包,如果闭包是最后一个参数,可以用以下写法•注意上下两段代码,} 的位置func loadData() {dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in print("耗时操作\(NSThread .currentThread())") }}•闭包的简写,如果闭包中没有参数和返回值,可以省略func loadData() {dispatch_async(dispatch_get_global_queue(0, 0)) {print("耗时操作\(NSThread .currentThread())") }}自定义闭包参数,实现主线程回调•添加没有参数,没有返回值的闭包override func viewDidLoad() {super.viewDidLoad()loadData {print("完成回调")}}// MARK: - 自定义闭包参数func loadData(finished: ()->()) {dispatch_async(dispatch_get_global_queue(0, 0)) {print("耗时操作\(NSThread.currentThread())")dispatch_sync(dispatch_get_main_queue()) {print("主线程回调\(NSThread.currentThread())")// 执行回调finished()}}}•添加回调参数override func viewDidLoad() {super.viewDidLoad()loadData4 { (html) -> () inprint(html)}}/// 加载数据/// 完成回调- 传入回调闭包,接收异步执行的结果func loadData4(finished: (html: String) -> ()) {dispatch_async(dispatch_get_global_queue(0, 0)) {print("加载数据\(NSThread.currentThread())")dispatch_sync(dispatch_get_main_queue()) {print("完成回调\(NSThread.currentThread())")finished(html: "<h1>hello world</h1>")}}}循环引用•建立NetworkTools 对象class NetworkTools: NSObject {/// 加载数据////// - parameter finished: 完成回调func loadData(finished: () -> ()) {print("开始加载数据...")// ...finished()}deinit {print("网络工具88")}}•实例化NetworkTools 并且加载数据class ViewController: UIViewController {var tools: NetworkTools?override func viewDidLoad() {super.viewDidLoad()tools = NetworkTools()tools?.loadData() {print("come here \(self.view)")}}/// 与OC 中的dealloc 类似,注意此函数没有()deinit {print("控制器88")}}运行不会形成循环引用,因为loadData 执行完毕后,就会释放对self 的引用•修改NetworkTools,定义回调闭包属性/// 完成回调属性var finishedCallBack: (()->())?/// 加载数据////// - parameter finished: 完成回调func loadData(finished: () -> ()) {self.finishedCallBack = finishedprint("开始加载数据...")// ...working()}func working() {finishedCallBack?()}deinit {print("网络工具88")}运行测试,会出现循环引用解除循环引用•与OC 类似的方法/// 类似于OC 的解除引用func demo() {weak var weakSelf = selftools?.loadData() {print("\(weakSelf?.view)")}}•Swift 推荐的方法loadData { [weak self] inprint("\(self?.view)")}•还可以loadData { [unowned self] inprint("\(self.view)")}闭包(Block) 的循环引用小结•Swift◦[weak self]▪self是可选项,如果self已经被释放,则为nil◦[unowned self]▪self不是可选项,如果self已经被释放,则出现野指针访问•Objc◦__weak typeof(self) weakSelf;▪如果self已经被释放,则为nil◦__unsafe_unretained typeof(self) weakSelf;如果self已经被释放,则出现野指针访问。
Swift的构造和析构过程
Swift的构造和析构过程构造过程Swift的构造过程通过定义构造器来实现。
只是与Objective-C不同的是,Swift的构造器不须要返回值,相同也不须要表明Func。
另外值得提的是,当构造器中为存储型属性赋值时。
不会触发属性观測器。
定制化的构造过程1. 除了默认的构造器外,我们能够通过添加參数的⽅式来为其加⼊⾃⼰定义的构造函数或者叫便捷构造器(covenience initializer)。
2. 构造器⾃⼰主动⽣成外部參数名。
假设不希望则⽤"_"下划线来屏蔽掉。
3. 若属性为Optional类型的,在构造器中假设未赋值,编译器默认赋值为nil。
4. 仅仅要在构造结束前常量的属性确定。
则可在构造过程的随意时间点改动常量属性,但不能在⼦类中改动。
5. 若不写init也会有默认构造器。
6. 结构体有默认的逐⼀成员构造器。
类的继承和构造过程构造器代理我们能够通过调⽤其它的构造器来完毕部分构造过程,且仅仅能在构造器内部调⽤self.init强调⼀点的是。
类的全部存储型属性。
包含继承⾃⽗类的。
必须在构造过程中设置初始值。
构造器链在苹果的语⾔⽂档中,给构造器代理调⽤说明了三条原则:1. 指定构造器必须调⽤其直接⽗类的指定构造器。
2. 便利构造器必须调⽤同⼀类中定义的其它构造器。
3. 便利构造器终于以调⽤⼀个指定构造器结束。
简单来讲为指定构造器向上调⽤。
⽽便利构造器横向调⽤。
⼆段式的构造过程第⼀阶段:每⼀个存储型属性通过引⼊它们的类构造器来设初始化值。
第⼆阶段:在准备使⽤前进⼀步定制。
为了保证⼆段式构造顺利完毕,编译器会运⾏4种有效的安全检查:1. 指定构造器必须保证其所在类引⼊的全部属性都初始化完毕之后才⼲将其它任务向上代理给⽗类构造器。
2. 指定构造器须先调⽤⽗类的构造器才⼲为继承来的属性赋新值。
3. 便利构造器须先调⽤其它构造器。
再能赋新值。
不然则可能会被覆盖掉。
4. 构造器在第⼀阶段完毕前,不能调⽤不论什么实例⽅法,訪问实例属性及self。
swift 高级用法
swift 高级用法Swift 高级用法Swift 是一门新兴的编程语言,它既简单易学,又功能强大。
在使用Swift 进行编程时,如果只停留在基础用法上,那么无法充分发挥Swift 的优势。
因此,在这里我们将介绍一些 Swift 的高级用法。
一、泛型泛型是 Swift 中非常重要的一个特性。
它可以让我们写出更加灵活、通用的代码,并且可以避免代码重复。
泛型可以应用于函数、结构体、类和枚举等各种类型。
1. 泛型函数泛型函数是指可以接受任何类型的参数并返回任何类型的值的函数。
下面是一个简单的泛型函数示例:```func swapTwoValues<T>(_ a: inout T, _ b: inout T) {let temporaryA = aa = bb = temporaryA}```该函数接受两个参数,并将它们互换。
其中,`<T>` 表示这是一个泛型函数,`T` 是一个占位符类型名字,表示传入参数的类型。
2. 泛型类型除了函数外,Swift 还支持定义泛型类型。
下面是一个简单的栈结构体示例:```struct Stack<Element> {var items = [Element]()mutating func push(_ item: Element) {items.append(item)}mutating func pop() -> Element {return items.removeLast()}}```该结构体定义了一个栈,可以存储任何类型的元素。
其中,`<Element>` 表示这是一个泛型类型,`Element` 是一个占位符类型名字,表示栈中存储的元素的类型。
二、高阶函数高阶函数是指接受函数作为参数或返回函数作为结果的函数。
Swift 中有很多高阶函数,如 `map`、`filter`、`reduce` 等。
这些函数可以让我们写出更加简洁、优雅的代码。
swift学习(一)基础知识(基本数据类型,操作符,流控制,集合)
swift学 习 ( 一 ) 基 础 知 识 ( 基 本 数 据 类 型 , 操 作 符 , 流 控 制 , 集合)
/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. func map<U>(f: @noescape (T) -> U) -> U?
/// Returns `f(self)!` iff `self` and `f(self)` are not nil. func flatMap<U>(f: @noescape (T) -> U?) -> U?
关键字 共 60个
与声明有关的14个:class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var 与语句有关的14个:break, case, continue, default, do, else, fallthrough, if, in, for, return, switch, where, while
?? 空值合并运算符
// 对 a 进行判断,如果不为 nil 则解包,否则就返回 b // a 必须是 optional 的 // b 必须和 a 类型一致 // 相当于三目运算符的简化版 var a: String? = "a" var b: String? = "b" var c = a ?? b // "a"
php流程控制语句
php流程控制语句
PHP流程控制语句是编写PHP程序时必不可少的一部分。
这些语句允许开发者控制程序的执行流程,根据不同的条件执行不同的操作。
常见的流程控制语句包括条件语句if/else、循环语句while、for和foreach,以及分支语句switch/case。
这些语句可以结合使用,以实现更加复杂的程序逻辑。
if/else语句根据指定条件执行不同的代码块,例如根据用户输入的数字判断是偶数还是奇数。
while循环语句可以用来重复执行一段代码,直到指定条件不满足为止。
for循环语句通常用于遍历数组或执行一定次数的循环操作。
foreach语句则是专门用来遍历数组的。
switch/case分支语句可以根据不同的情况执行不同的操作,例如根据用户选择的选项执行相应的操作。
除了上述语句外,PHP还提供了一些其他的流程控制语句,例如continue和break语句,用于控制程序的流程。
开发者应该根据具
体情况选择合适的语句,以确保程序的正确性和高效性。
总的来说,流程控制语句是编写PHP程序时必须掌握的基本语法之一。
只有熟练掌握了这些语句,才能写出高质量的PHP程序。
- 1 -。
