Swift教程

Swift解读专题一——Swift2.2语言预览

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 08:58:04
专题一——Swift2.2语言预览 一、引言 本系列专题是我通过阅读Swift2.2语言开发文档,翻译总结加上自己的理解整理而成。其中大部分结构和内容都来自开发文档,有疏漏和错误之处,还望更多朋友指出,共同交流进步,我的QQ:316045346。 二、从HelloWorld开始 在学习很多编程语言时,都是从HelloWorld入门,下面代码就是一个完整的HelloWorld程序: print("Hello, World!") 分析上面代码,可以发现Swift语言的3个十分明显的特点: 1.开发者不需要引入输入输出相关的函数库。 2.在编写代码时,不需要在语句的结尾处添加分号。 3.全局的代码就是程序的入口,不需要类似C系语言的main()方法来作为程序入口。 三、常量与变量 常量和变量是编程语言中最基础的两类数据类型,常量可以理解为为某个值起一个特定的名字,常量通常提供给开发者用于某些只赋值一次但却在程序中多处使用的量值。变量也可以进行多次修改。分别使用let和var创建常量和变量。例如: let letValue = 4 var varValue = 8 varValue = 16 开发者在进行常量和变量的创建时,并不需要制定类型,编译器与根据第一次赋值的类型来推断出常量或者变量的类型,然而这并不是说Swift语言不严格要求变量或常量的类型,一旦编译器推断了值的类型

Swift专题讲解十六——ARC在Swift中的应用

北慕城南 提交于 2019-12-03 08:57:52
Swift专题讲解十六——ARC在Swift中的应用 一、引言 ARC(自动引用计数)是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于ARC的例子:在一个公用的图书馆中,每次进入一人就将卡插入,走的时候将自己的卡拔出拿走。图书馆系统会判定只要有卡插入,就将图书馆的灯打开,当所有卡都被取走后,将图书馆的灯关掉。这个例子对应于Objective-C中的对象声明周期管理十分贴切。每当一个对象增加一个引用时,其引用计数会加1,当一个引用被取消时,对象的引用计数减1,当引用计数减为0时,说明此对象将不再有任何引用,对象会被释放掉,让出内存。Swift也采用同样的方式进行内存管理。 注意:在Swift中只有引用类型有自动引用计数,结构体、枚举这类值类型是没有引用计数的。关于引用计数的示例代码如下: class MyClass { deinit{ print("MyClass deinit") } } var cls1:MyClass? = MyClass() var cls2:MyClass? = cls1 var cls3:MyClass? = cls2 cls2 = nil cls1 = nil //执行下面代码后才会打印“MyClass deinit” cls3 = nil 二、循环引用的处理方法 在开发中

Swift解读专题二——基本类型

痴心易碎 提交于 2019-12-03 08:57:26
Swift解读专题二——基本类型 一、常量和变量 Swift语言的常量和变量在使用之前,必须被定义。常量用于处理程序中只在初始化时设置的量值,之后不能进行赋值改变,变量用于处理程序中可以进行改变的量值。分别用let和var来声明常量和变量,示例如下: var varValue = 1 let letValue = 10 Swift语法也支持在一行中声明多个量值,示例如下: var a=1,b=2.9,c="string" 在声明量值时,编译器会根据第一次赋值的类型来推断出变量的类型,一旦量值的类型被推断,则不能够进行更改,开发者也可以手动注释量值的类型,示例如下: var a:Int=1,b:Float=2.9,c:String="string" 在一行中声明多了变量并且没有提供初始值时,为最后一个变量注释的变量类型也会应用于本行中的所有变量,示例如下: var one,two,three:Int 官方文档建议,在实际应用中,注释量值的类型是十分少用的,一般都会为其赋值初始值后让编译器自行推断。 量值的命名可以包含Unicode字符和数字,需要注意,是不能以数字作为量值名称的开头的。空格,数学符号,制表符,箭头等符号也不可以使用。示例如下: //中文符作变量名 var 珲少 = "me" //表情符作为变量名 var 😄 = "开心" //含有数字的变量名 var

Swift讲解专题九——枚举

六眼飞鱼酱① 提交于 2019-12-03 08:57:13
Swift讲解专题九——枚举 一、引言 在Objective-C语言中,没有实际上是整型数据,Swift中的枚举则更加灵活,开发者可以不为其分配值类型把枚举作为独立的类型来使用,也可以为其分配值,可以是字符,字符串,整型或者浮点型数据。 二、枚举语法 Swift中enum关键字来进行枚举的创建,使用case来创建每一个枚举值,示例如下: //创建姓氏枚举,和Objective-C不同,Swift枚举不会默认分配值 enum Surname { case 张 case 王 case 李 case 赵 } //创建一个枚举类型的变量 var myName = Surname.张 //如果可以自动推断出类型 则枚举类型可以省略 myName = .李 var myName2:Surname = .王 同样可以将枚举值都写在同一个case中,使用逗号分隔: enum Planet { case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } 枚举经常会和Switch语句结合使用,示例如下: switch myName { case .张: print("姓氏张") case .王: print("姓氏王") case .李: print("姓氏李") case .赵: print("姓氏赵") } 三

Swift讲解专题十二——方法

爱⌒轻易说出口 提交于 2019-12-02 05:44:42
Swift讲解专题十二——方法 一、引言 方法只是一个术语,其实就是将函数与特定的类型结合,类、结构体、枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于Objective-C中的类方法。Swift和Objective-C的一大不同是,Objective-C只有在类中可以定义方法。 二、实例方法基础 实例方法的语法和函数完全一致,其和具体类型的实例所关联,实例方法在调用时由类型的实例点语法进行调用来完成一些功能模块。示例如下: class Math { //完成加法功能的实例方法 func add(param1:Double,param2:Double)->Double{ return param1+param2 } } //创建类型实例 var obj = Math() //调用方法进行计算 obj.add(5, param2: 5) 与Objective-C类似,Swift中每一个类的实例中都隐藏含有一个self属性,self属性就是实例本身,开发者可以在实例方法中使用self来调用属性或者其他实例方法,示例如下: class Math { //完成加法功能的实例方法 func add(param1:Double,param2:Double)->Double{ return param1+param2 } func mul(param1:Double,param2

Swift讲解专题十一——属性

泪湿孤枕 提交于 2019-12-02 02:23:49
Swift讲解专题十一——属性 一、引言 属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。 二、存储属性 存储属性使用变量或者常量来存储一个值,在声明存储属性时,可以为其设置一个默认值,也可以在构造示例是进行值的设置,属性可以通过点语法来访问,结构体的存储属性示例代码如下: struct MyStruct { var property1 = 1 var property2:Int } var obj = MyStruct(property1: 1, property2: 2) //通过点语法进行属性的访问 print(obj.property1,obj.property2) 如上结构体,如果有属性被声明成let常量,则此属性不能够被修改。还有一点需要注意,如果在创建结构体的实例时,使用的是let进行创建,则即便结构体中的属性是变量也不可进行修改。这和类有很大区别。 还有一类存储属性叫做延时存储属性,可以设想一下这样的情形,类的某些属性可能并不是在每次类实例后都会用到,并且有些属性的构造可能会消耗大量的时间,这时一个比较聪明的设计便是在类进行实例化时,这类属性并不被构造,当次类的实例使用到这个属性时,这个属性才被构造出来,这样的属性被称为延时存储属性

Swift讲解专题八——闭包

梦想的初衷 提交于 2019-12-02 00:45:40
Swift讲解专题八——闭包 一、引言 Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。 二、从一个系统函数看闭包 Swift标准函数库中提供了一个sort排序函数,对于已经元素类型的数组,调用sort函数会进行重新排序并返回新的排序后的数组。这个sort函数可以接收一个返回值为Bool类型的闭包,来确定第一个元素是否排在第二个元素前面。代码示例如下: var array = [3,21,5,2,64] func func1(param1:Int,param2:Int) -> Bool { return param1>param2 } //通过传入函数的方式 //array = [64,21,5,3,2] array = array.sort(func1) //通过闭包的方式 //array = [2,3,5,21,64] array = array.sort({(param:Int,param2:Int)->Bool in return param<param2 }) Swift语言有一个很显著的特点就是简洁,可以通过上下文推断出类型的情况一般开发都可以将类型的书写省略,这也是Swift语言设计的一个思路,由于闭包是作为函数的参数传入函数中的,因为函数参数的类型是确定

Swift讲解专题六——流程控制

泄露秘密 提交于 2019-12-02 00:45:26
Swift讲解专题六——流程控制 一、引言 一种编程语言的强大与否,很大程度上取决于其提供的程序流程控制方案,就如使用汇编语言实现复杂的程序流程是一件痛苦的事情。Swift中提供了许多强大的流程控制语句,例如快速遍历for-in,while循环,repeat-while循环,switch选择等,需要注意的是,在Swift2.2中,for(a;b;c)循环已经被弃用掉,并且Swift中的Switch语句也更加强大,可以处理任意数据类型。 二、for-in循环 配合范围运算符,for-in循环可以用来执行确定次数的循环,示例如下: for index in 1...5 { print(index) } //如果不需要获取循环中每次的循环次数 可以使用如下方式 var sum=0; for _ in 1...3 { sum += 1 } for-in循环也通常会用来遍历数组,字典,集合等,示例如下: var collection1:Array = [1,2,3,4] var collection2:Dictionary = [1:1,2:2,3:4,4:4] var collection3:Set = [1,2,3,4] for obj in collection1 { print(obj) } for (key , value) in collection2 { print(key

Swift解读专题四——字符串与字符

梦想与她 提交于 2019-12-02 00:45:10
Swift解读专题四——字符串与字符 一、引言 Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便。 二、String基础 在Swift中,使用双引号来定义字符串,开发者可以通过如下代码来创建一个字符串常量: let str = "Hello, playground" 可以通过下面两种方式来创建空字符串: let str1 = "" let str2 = String() 调用isEmpty方法可以判断某个字符串是否为空字符串,这个方法将返回一个Bool值,可以直接用于if语句: if str1.isEmpty { print("this String Object is Empty") } 不像Objective-C有NSString与NSMutableString的区别,在Swift中,如果需要创建可变的字符串,只需用变量来接收: var str3 = "Hello" str3 += " "+"World"//str3 = Hello World String也可以使用插值的方法来构造新的字符串,使用\()的方式来将插值的表达式写在小括号内,示例如下: let multiplier = 3 let

Swift专题讲解十八——异常处理

故事扮演 提交于 2019-12-01 01:23:22
Swift专题讲解十八——异常处理 一、异常的抛出与传递 代码的运行很多时候并不会完全按照程序员的设想进行,编写代码时进行可控的异常处理机制是十分必要的。通常,对于一个特定的操作,程序员可以定义一个继承自ErrorType的枚举来进行异常类型的描述,使用throw关键字来进行异常的抛出,示例代码如下: //定义一个自定义的错误类型 enum MyError:ErrorType { case DesTroyError case NormalError case SimpleError } //进行异常的抛出 throw MyError.NormalError 函数可以进行错误的传递,需要使用throws关键字来声明这个函数可能会抛出错误,如果不如此声明,则函数内部抛出的错误只能在函数内部解决,throws关键字标记的函数内部抛出的错误会被传递到调用函数的地方,开发者可以在调用函数的地方捕获到错误描述来做相应处理,示例如下: func MyFunc()throws -> Void { throw MyError.NormalError } 对于可能抛出异常的函数调用,开发者要么在调用函数的地方捕获处理这些异常,要么使用try关键字将异常继续抛出去,等待下一层捕获者处理。异常的处理后面会介绍,继续抛出异常示例如下: try MyFunc() 二、异常的处理 除了将错误继续向上抛出之外