Swift教程

Swift专题讲解二十二——泛型

我的梦境 提交于 2019-12-01 01:23:13
Swift专题讲解二十二——泛型 一、以泛型为参数的函数 泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图。我们知道,有参函数的参数必须有一个明确的参数类型,有些时候开发者会遇到这样一种情况,编写一个函数用于交换两个变量的值,由于变量有类型之分,实现相同的功能,可能需要重载成多个函数来实现,这大大浪费了开发成本,使用泛型,可以完美的解决这个问题,示例代码如下: func exchange<T>(inout param1:T,inout param2:T){ let tmp = param1 param1 = param2 param2 = tmp } var p1 = "15" var p2 = "40" exchange(&p1, param2: &p2) 上面的方法可以实现对任意相同类型变量的交换,函数参数中使用泛型,需要在函数名后的<>中定义参数占位符,如有多个参数占位符,用逗号隔开即可。 二、泛型在类型中的应用 泛型除了可以作为函数的参数、返回值外,在定义类型时,灵活应用泛型也可以解决很多十分棘手的问题,例如实现一个栈结构的集合类型,示例代码如下: struct Stack<ItemType> { var items:[ItemType] = [] mutating func push(param:ItemType) {

Swift讲解专题十——类与结构体

拟墨画扇 提交于 2019-12-01 01:21:56
Swift讲解专题十——类与结构体 一、引言 Swift中的类与结构体十分相似,和Objective-C不同的是,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法。 Swift中的类与结构体有如下相似点: 1.定义属性来存储值。 2.定义函数来提供功能。 3.通过定义下标语法使用下标的方式取值。 4.定义构造方法来对其进行初始化。 5.通过扩展来在原始基础上添加功能。 6.通过协议来定义实现标准。 当然类和结构体也有许多不同点,下面这些功能是类独有的,结构体没有: 1.通过继承来创建类的子类。 2.在运行时允许对类的实例进行类型的检查和解释。 3.析构方法可以释放被类引用的资源。 4.通过引用计数允许一个类实例的多处引用。 当开发者在代码中传递这些实例时,结构体总是被复制,而类则是被引用。这是结构体和类的最本质区别。 二、类与结构体的定义 类与结构体在定义语法上相似,示例代码如下: class MyClass { var name = "HS" var age = 25 } struct MyStruct { var param1:Int var param2:String } //创建类的实例 var obj1 = MyClass() //创建结构体的实例 所有结构体会默认生成一个逐个设置属性的构造方法 而类不会 var obj2 = MyStruct

Swift讲解专题五——集合类型

*爱你&永不变心* 提交于 2019-11-30 20:48:56
Swift讲解专题五——集合类型 一、引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型。Array用于存放一组有序的数据,数据角标从0开始一次递增;Set用于存放一组无序的数据,数据不可以重复;Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一。这里借用官方文档中的一张图来表示3种集合类型的特点: 二、Array类型 Array通常也被称为数组,Swift是一种类型安全语言,其中的Array类型也必须确定其元素的类型,声明数组类型有两种方法,示例如下: //将数组声明为Int类型值集合的数组 var array1:[Int] var array2:Array<Int> //创建空数组 array1 = [] array2 = Array() 数组对象如果通过var变量也接收,则其为可变的数组,可以通过append方法来追加元素,示例如下: //向数组中追加元素 array1.append(3) 在创建数组时,也可以对数组进行初始化,示例如下: //创建数组[0,0,0] var array3 = [Double](count: 3, repeatedValue: 0) //创建数组[2.5,2.5,2.5] var array4 = Array(count: 3, repeatedValue

Swift讲解专题七——函数

倾然丶 夕夏残阳落幕 提交于 2019-11-30 20:48:42
Swift讲解专题七——函数 一、引言 函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用。Swift提供了十分灵活的方式来创建与调用函数。事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定。Swift和Objective-C的一大区别就在于Swift中的函数可以进行嵌套。 二、函数的创建与调用 函数通过函数名,参数和返回值来定义,参数和返回值决定一个函数的类型,在调用函数时,使用函数名来进行调用,示例如下: //传入一个名字 打印并将其返回 func printName(name:String) -> String { print(name) return name } //进行函数的调用 printName("HS") 也可以创建没有参数的函数: func onePuseTwo()->Int { return 1+2 } onePuseTwo() 同样也可以创建没有返回值的函数: func sayHello(){ print("Hello") } sayHello() 上面介绍的函数类型都比较常见,对于多返回值的函数,在Objective-C中十分难处理,开发者通常会采用字典、数组等集合方式或者干脆使用block回调,在Swift中,可以使用元组作为函数的返回值,示例如下: func tuples()->(Int,String){ return

Swift讲解专题十三——下标访问

不打扰是莪最后的温柔 提交于 2019-11-30 20:48:34
Swift讲解专题十三——下标访问 一、引言 在以前的博客中,讨论过在Objective-C中,通过下标的方式访问自定义数据模型的方法。Objective-C中主要是通过实现一系列方法来使自定义的数据类型支持下标的访问方式,博客地址如下: 在Objective-C中使用下标访问自定义数据模型: http://my.oschina.net/u/2340880/blog/632294 。 Swift中的Array,Dictionary类型可以通过下标或者键值的方式来进行数据的访问,实际上在Swift的语法中,下标可以定义在类、结构体、枚举中。开发者可以通过下标的方式来对属性进行访问而不用使用专门的存取方法。并且定义的下标不限于一维,开发者可以定义多维的下标来满足需求。 二、下标的语法结构 下标使用subscript来定义,其有些类似于方法,参数和返回值分别作为下标入参和通过下标所取的值。但是在subscript实现部分,又十分类似于计算属性,其需要实现一个get块和可选实现一个set块,get块用于使用下标取值,set块用于使用下标设置值,因此,subscript结构更像是计算属性和方法的混合体,示例如下: class MyClass { var array=[1,1,1,1,1] subscript(param1:Int)->Int{ set{ array[param1] =

Swift专题讲解二十——扩展

北城以北 提交于 2019-11-30 20:48:19
Swift专题讲解二十——扩展 一、简介 Swift中的扩展与Objective-C中的类别功能相似,扩展可以为一个已有的类、结构体、枚举或者协议添加新的属性或方法,与Objective-C的类别不同的是,Swift中的扩展没有名称。 Swift中的扩展支持如下功能: 1.添加计算属性 2.定义实例方法和类型方法 3.定义新的构造方法 4.定义下标方法 5.定义嵌套类型 6.使一个已有的类遵守协议 7.对协议进行扩展添加新的方法 二、使用扩展添加计算属性 使用extension来声明扩展,示例代码如下: //创建一个类 有两个属性 class MyClass { var name:String var age:Int init(){ name = "HS" age = 24 } } //为MyClass类扩展一个计算属性 extension MyClass { var nameAndAge:String{ return "\(name)"+"\(age)" } } var obj = MyClass() obj.nameAndAge 三、使用扩展添加构造方法 需要注意的是,扩展不能为类添加指定构造方法,只可以为其添加便利构造方法,示例代码如下: //创建一个类 有两个属性 class MyClass { var name:String var age:Int init(){

Swift专题讲解二十一——协议

回眸只為那壹抹淺笑 提交于 2019-11-30 20:48:05
Swift专题讲解二十一——协议 一、引言 协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。 二、在协议中定义属性和方法 协议中定义的属性只约定名称和类型,在具体类型的实现中,其可以是存储属性也可以是计算属性,协议中还需要指定属性是可读的还是可读可写的。示例代码如下: protocol MyPortocol { //定义实例属性 //可读的 var name:String{get} //可读可写的 var age:Int{set get} //可读的 var nameAndAge:String{get} static var className:String{get} } class MyClass: MyPortocol { var name: String var age: Int var nameAndAge: String{ get{ return "\(name)"+"\(age)" } } static var className: String{ get{ return "MyClass" } } init(){ name = "HS" age = 24 } }

Swift专题讲解十四——继承

寵の児 提交于 2019-11-29 20:03:02
Swift专题讲解十四——继承 一、引言 Swift中,一个类可以从另一个类继承方法、属性、下标及其他特性。当一个类继承于另一个类时,这个类被称为子类,所继承的类被称为父类。在Swift中,继承是类区别于其他类型的主要特征。子类除了可以调用父类的属性,下标,方法外,其也可以对父类的属性,下标,方法进行覆写。 二、定义一个基类 不继承于任何类的类被称为基类,示例如下: class Shape { var center:(Double,Double) init(){ center = (0,0) } } 上面代码定义了一个图形类,其中定义了一个中心点,任何图形都会有中心点,所以把其作为基类属性。 三、定义一个子类 图形基类可以派生出许多图形子类,例如矩形,圆形等,示例代码如下: class Circle: Shape { var Radio:Double = 0 } class Rect: Shape { var size:(Double,Double)=(0,0) } var circle = Circle() circle.center = (1,1) 可以看到,Circle类从父类中继承到了center属性。默认子类也会继承父类的构造方法,如果子类需要实现自己的构造方法,可以对父类的方法进行覆写,使用override关键字: class Rect: Shape { var

Swift专题讲解十九——类型转换

 ̄綄美尐妖づ 提交于 2019-11-29 16:51:13
Swift专题讲解十九——类型转换 一、类型检查与转换 在Objective-C和Java中,任何类型实例都可以通过强转使编译器认为它是另一种类型的实例,这么做其实是将所有的安全检查工作都交给了开发者自己来做。先比之下,Swift中的Optional类型转换就会比较安全与可靠。 Swift中使用is关键字来进行类型的检查,其会返回一个布尔值true或者false来表明检查是否成立,示例如下: var str = "HS" if str is String { print(str) } Swift中有向上兼容与向下转换的特性,就是说,一个父类类型的集合可以接收子类的实例,同样,在使用这些实例变量时可以将其向下转换为子类类型,示例如下: //自定义一个类及其子类 class MyClass { var name:String? } class MySubClassOne: MyClass { var count:Int? } class MySubClassTwo: MyClass { var isBiger:Bool? } //创建3个实例 var obj1 = MyClass() obj1.name = "HS" var obj2 = MySubClassOne() obj2.count = 100 var obj3 = MySubClassTwo() obj3.isBiger