关注公众号 领VIP会员
下次再说
Swift语言视频教程入门与提高(下)视频课程

首发

下载课程

下载学院APP

缓存视频离线看

微信公众号
收藏(66)

Swift语言视频教程入门与提高(下)视频课程

课程目标: 掌握Swift语言技巧并进行实战开发

5分 共138课时 共25小时40分钟 更新时间: 30天前

学习人数榜9

2424小时内答疑

课时永久观看

退15分钟内无条件退款

  1. 仅限付费视频课程适用
  2. 购买后15分钟内可以找到客服进行沟通退款
  3. 下载资料后不再享有退款特权
  4. 客服(Tel:400-101-1651)
  5. 最终解释权归51CTO学院所有

专属资料下载

课程介绍

课程大纲

学习资料

学员评价

课程目标
掌握Swift语言技巧并进行实战开发
适用人群
iOS初学者,iOS入门,对iOS开发感兴趣
课程简介
  • 函数的介绍

    什么是swift中的函数

  • 1使用函数

    函数语法:func 函数名(参数列表) -> 返回值类型 { 语句组 return 返回值} 需要了解的问题:1、关于单值和多值返回。2、关于无法返回值情况。函数定义示例代码如下:func rectangleArea(width:Double, height:Double) -> Double { ...

  • 2参数传递

    swift中函数参数传递

  • 2.1使用外部参数名

    func rectangleArea(width:Double, height:Double) -> Double { let area = width * height return area}println("320x480的长方形的面积:\(rectangleArea(320, 480))")1、有什么问题吗?func rectangleArea(W width:Double, H height:Double) ->...

  • 2.2参数默认值

    我们在定义函数的时候可以为参数设置一个默认值,当调用函数的时候可以忽略该参数。看下面的一个示例:func makecoffee(type : String = "卡布奇诺") -> String { return "制作一杯\(type)咖啡。"}let coffee1 = makecoffee(type: "拿铁") let ...

  • 2.3可变参数

    Swift中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数,它们具有相同的类型,有点像是传递一个数组。我们可以通过在参数类型名后面加入(...)的方式来指示这是可变参数。下面看一个示例:func sum(numbers: Double...) -> Double { var total: Doub...

  • 2.4参数的传递引用

    参数传递方式有两种:值类型和引用类型。只有类是引用类型,其他的数据类型如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体全部是值类型。示例:class PassTest {   var ptValue = 0}func changeObjValue(ref : PassTest ){   ref.ptValue = 9...

  • 3.1无返回值函数

    func 函数名(参数列表) { 语句组}func 函数名(参数列表) ->() { 语句组}func 函数名(参数列表) ->Void { 语句组}示例:func increment(inout value:Double, amount:Double = 1.0) { ...

  • 3.2多返回值函数

    两种方式实现:参数声明为引用类型传递将返回定义为元组类型。1.引用类型传递示例:func changeInt(inout value1 : Int, inout value2 : Double){ value1 = 55 value2 = 1.23}var val1 = 0var val2 = 0.0changeInt(&val1, &val2)print...

  • 4.函数类型

    函数可以作为一种类型使用,作为类型与其它数据类型没有区别。

  • 4.1作为函数返回类型使用

    我们可以把函数类型作为另一个函数的返回类型使用。

  • 4.2作为参数类型使用

    我们可以把函数类型作为另一个函数的参数类型使用

  • 5.函数重载

    1.函数重载概念:函数重载是指多个函数享有相同的名字但是函数的参数列表或返回值类型不同的一组函数,它们互相构成重载关系。2.与其它语言的不同:Swift的函数类型包括了参数列表类型和返回值类型,例如(Double, Double) -> Double参数类型是由两个Double类型参数列表和Doubl...

  • 6.嵌套函数

    我们也可以把函数定义在另外的函数体中,称作嵌套函数。示例:func calculate(opr :String)-> (Int,Int)-> Int { //定义+函数 func add(a:Int, b:Int) -> Int { return a + b } //定义-函数 func sub(a:In...

  • 7.泛型和泛型函数

    泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定。使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。

  • 7.1一个问题的思考

    自定义日志函数。String类型func log4String(msg : String) {   println(msg)}Int类型func log4Int(msg : Int) {   println(msg)}Double类型func log4Double(msg : Double) {   println(msg)}可以合并为一个函数吗?

  • 7.2泛型函数

    在函数名log4后面添加,参数的类型也被声明为T,T称为占位符,函数在每次调用时传入实际类型才能决定T所代表的类型。示例如下:func log4(msg : T) { println(msg)}log4(3)log4("tony")log4(1.02)如果有多个不同类型,可以使用其他大写字母,一般情况下我们习惯...

  • 7.3.泛型约束

    有些占位符必须遵守某种协议,及T占位符后面添加冒号和协议类型,这种表示方式被称为泛型约束,它能够替换T的类型。例如一个比较函数如下:func isEquals(a: T, b: T) -> Bool { return (a == b)}上面的函数在编译时会有错误发生,这是因为并不是所有的类型都...

  • 20150309第一期开班典礼

    20150309第一期iOS就业班课程开班典礼

  • 20150313第二期直播答疑

    20150313iOS在线就业班第二期直播答疑

  • 20150316第三期直播答疑

    20150316iOS就业班第三期直播答疑

  • 20150320第四期直播答疑

    iOS高薪在线就业班20150320第四期直播答疑

  • 20150324第五期直播答疑

    iOS高薪在线就业班第五期直播答疑

  • 20140327第六期

    iOS在线就业班20140327第六期直播答疑

  • 1.回顾嵌套函数-1

    还记得9.6节中的示例吗?如下所示:func calculate(opr :String)-> (Int,Int)-> Int {     //定义+函数   func add(a:Int, b:Int) -> Int {     return a + b   }   //定义-函数   func sub(a:Int, b:Int) -> Int...

  • 1.回顾嵌套函数-2

    还记得9.6节中的示例吗?如下所示:func calculate(opr :String)-> (Int,Int)-> Int {     //定义+函数   func add(a:Int, b:Int) -> Int {     return a + b   }   //定义-函数   func sub(a:Int, b:Int) -> Int ...

  • 2.闭包的概念

    一门计算语言要支持闭包的前提有两个。•     支持函数类型,能够将函数作为参数或返回值传递。•     支持函数嵌套。Swift中的闭包类似于C和Objective-C 中的代码块、C++和C#中的Lambda表达式、Java中的匿名内部类。

  • 3.1类型推断简化

    Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:{(a:Int, b:Int) -> Int in return a + b}Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:{a, b in return a + b }简化方式后的示例代码如下:func ...

  • 3.2隐藏return关键字

    如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:{a, b in a + b }使用这种简化方式修改后的示例代码如下:func calculate(opr :String)-> (Int,Int)-> Int { var result : ...

  • 3.3缩写参数名称

    Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。func calculate(opr :String)-> (Int,Int)-> Int {   var result : (Int,Int)-> Int     ...

  • 3.4使用闭包返回值

    闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:let c1:Int = {(a:Int, b:Int) -> Int in return a + b }(10,5) ...

  • 4.使用尾随闭包

    闭包表达式可以作为函数的参数传递。func calculate(opr:String, funN:(Int,Int)-> Int) { switch (opr) { case "+" : println("10 + 5 = \(funN(10,5))") default: println("10 - 5 = \(funN(10,5))") ...

  • 5.捕获上下文中的变量和常量

    嵌套函数或闭包可以访问它所在上下文的变量和常量,这个过程称为捕获值(capturing value)。即便是定义这些常量和变量的原始作用域已经不存在,嵌套函数或闭包仍然可以在函数体内或闭包体内引用和修改这些值。示例:func makeArray() -> (String)-> [String] { ...

  • 1.面向对象概念和基本特征

    面向对象(OOP)是现代流行的程序设计方法,是一种主流的程序设计规范。OOP的基本特征包括:封装性、继承性和多态性。• 封装性 封装性就是尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。• 继承性 一些特殊类...

  • 2.Swift中的面向对象类型

    1.类2.结构体(struct)3.枚举(enum)在Swift语言中通过类和结构体(struct)实现面向对象,在Swift语言中,枚举(enum)也具有面向对象特性。实例和对象在面向对象中,将类创建对象的过程称为实例化,因此将对象称为实例,但是在Swift中,结构体和枚举的实例不称为“对象”,...

  • 3.1枚举-成员值

    在枚举类型中定义一组成员,与C和Objective-C中枚举的主要作用是一样的,不同的是,在C和Objective-C中成员值是整数类型,因此在C和Objective-C中枚举类型就是整数类型。 在switch中使用枚举类型时,switch语句中的case必须全面包含枚举中的所有成员,不能多也不能少,包括使用defa...

  • 3.2枚举-原始值

    可以为枚举每个成员提供某种具体类型的默认值,我们可以为枚举类型提供原始值(raw values)声明,这些原始值类型可以是:字符、字符串、整数和浮点数等。

  • 3.3枚举-相关值

    在Swift中除了可以定义一组成员值,还可以定义一组相关值(associated values),它有点类似于C中的联合类型。下面看一个枚举类型的声明:enum Figure { case Rectangle(Int, Int) //元组类型 case Circle(Int)}枚举类型Figure(图形)有两个相关值: Rect...

  • 4.1结构体与类-类和结构体定义

    语法格式如下:class 类名 {   定义类的成员}struct 结构体名 {   定义结构体的成员}下面我们来看一个示例:class Employee {                       //定义员工类   var no : Int = 0    ...

  • 4.2结构体与类-再谈值类型和引用类型

    在众多的数据类型中,我们只需记住:只有类是引用类型,其他类型全部是值类型。即便结构体与类非常相似,它也是值类型。值类型还包括整型、浮点型、布尔型、字符串、元组、集合和枚举。Swift中的引用类型与Java中的引用类型是一样的,Java中的类也是引用类型。如果你没有Java经验,...

  • 4.3.结构体与类-引用类型的比较

    我们在第4章介绍了基本运算符,提到了恒等于(===)和不恒等于(!==)关系运算符。===用于比较两个引用是否为同一个实例,!==则恰恰相反,它只能用于引用类型,也就是类的实例。

  • 5.类型嵌套

    Swift语言中的类、结构体和枚举可以进行嵌套,即在某一类型的{}内部定义类。这种类型嵌套在Java中称为内部类,在C#中称为嵌套类,它们的形式和设计目的都是类似的。类型嵌套的优点是能够访问它外部的成员(包括方法、属性和其他的嵌套类型),嵌套还可以有多个层次。

  • 6.1.可选类型

    有时候我们使用一个变量或常量,它保存的值可能有也可能没有。1.比较给一个变量赋值nilvar emp1 : Employee = nilemp1 = Employee()我们需要下面的表达式赋值:var emp1 : Employee? = nilemp1 = Employee()Employee? 是Employee类型的可选类型,可以接收nil值...

  • 6.1.1.强制拆封和隐式拆封

    1. 强制拆封如果我们能确定可选类型一定有值,那么在读取它的时候,可以在可选类型的后面加一个感叹号(!)来获取该值。这种感叹号的表示方式称为可选值的强制拆封(forced unwrapping)。如下代码所示:let result1 : Double? = divide(100, 200)println(result1!)print...

  • 6.1.2.可选绑定

    可选类型赋值有风险性,可以先判断再赋值,可以用于判断,如下代码所示:func divide(n1 : Int, n2 : Int) ->Double? { if n2 == 0 { return nil } return Double(n1)/Double(n2)}let result1 : Double? = divide(100, ...

  • 6.2.可选链

    给定一个Employee实例,通过代码emp.dept.comp.name可以引用到Company实例,形成一个引用的链条,但是这个“链条”任何一个环节“断裂”(为nil)都无法引用到最后的目标(Company实例)。但是强制拆封有一个弊端,如果可选链中某个环节为nil,将会导致代码运行时错误。我们可以采用...

  • 6.3.使用了问号(_)和感叹号(!)总结

    1. 可选类型中的问号(?)声明这个类型是可选类型,访问这种类型的变量或常量时要使用感叹号(!),下列代码是强制拆封: let result1 : Double? = divide(100, 200) //声明可选类型println(result1!) //强制拆封取值2....

  • 7.访问限定

    Swift语言就可以实现封装特性了。由于在Swift语言中类、结构体和枚举类型都具有面向对象的特性,因此Swift语言的封装就变的比较复杂了。

  • 7.1.访问范围

    有关访问范围主要有两个:模块和源文件。1.关于模块模块是指一个应用程序包或一个框架,在 Swift中 , 可以用import关键字引入模块到自 己的工程中。应用程序包就是一个可执行的应用程序包,其内部包含了很多swift文件以及其他一些文件,应用程序包可以通过Xcode的模板创建的...

  • 7.2.访问级别

    Swift提供了3种不同访问级别,对于的访问修饰符:public、internal和private。这些访问修饰符可以修饰类、结构体、枚举等面向对象的类型,还可以修饰:变量、常量、下标、元组、函数、属性等内容。(为了便于描述我们把类、结构体、枚举、变量、常量、下标、元组、函数、属性等内容...

  • 7.3.1.统一性原则

    原则1,如果一个类型(类、结构体、枚举)定义为internal或private的,那么类型声明的变量或常量不能使用public访问级别。因为public的变量或常量被任何人访问,而internal或private的类型不可以。原则2,函数的访问级别不能高于它的参数和返回类型的访问级别。假设函数声明为public...

  • 7.3.2.设计原则

    如果我们编写的是应用程序,应用程序包中的所有swif文件和其中定义实体,都是给本应用使用的,而不是提供给其他模块使用,那么我们就不用设置访问级别了,也就是默认的访问级别。如果我们开发的是框架,框架编译的文件不能独立运行,因此它天生就是给别人使用的,这种情况下我们要详...

  • 7.3.3.元组类型的访问级别

    元组类型的访问级别是遵循它元组中字段**级的访问级别,例如如下代码:private class Employee { var no : Int = 0 var name : String = "" var job : String? var salary : Double = 0 var dept : Department?}st...

  • 7.3.4.枚举类型的访问级别

    枚举中成员的访问级别继承自该枚举,我们不能为枚举中的成员指定访问级别。 示例代码如下:public enum WeekDays {   case Monday   case Tuesday   case Wednesday   case Thursday   case Friday}由于WeekDays枚举类型是public访问级别,那么它的成员也是public级别。

  • 1.存储属性

    类是由属性和方法组成的,属性一般是访问数据成员。在Objective-C中,属性是为了访问封装后的数据成员(成员变量)而设计的,属性本身并不存储数据,数据是由数据成员存储的。而Swift中的属性分为存储属性和计算属性,存储属性就是Objective-C中的数据成员,计算属性不存储数据,但...

  • 1.1.存储属性概念

    示例:class Employee {   let no : Int = 0   var name : String = ""   var job : String?   var salary : Double = 0   var dept : Department?}struct Department {   let no : Int = 0   var name...

  • 1.2.延迟存储属性

    延迟存储属性

  • 2.1.计算属性概念

    计算属性提供了一个getter(取值访问器)来获取值,以及一个可选的setter(设置访问器)来间接设置其他属性或变量的值。

  • 2.2.只读计算属性

    计算属性可以只有getter访问器,没有setter访问器,这就是只读计算属性。示例:class Employee { var no : Int = 0 var firstName : String = "Tony" var lastName : String = "Guan" var job : String? var salary : D...

  • 2.3.结构体和枚举中的计算属性

    示例代码如下:struct Department { let no : Int = 0 var name : String = "SALES" var fullName : String { return "Swift." + name + ".D" }}var dept = Department()println(dept.fullName)...

  • 3.属性观察者

    为了监听属性的变化,Swift提供了属性观察者。属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到。但它们不能监听延迟存储属性和常量存储属性的变化。Swift中的属性观察者主要有以下两个。• willSet:观察者在修改之前调用。• di...

  • 4.静态属性

    在介绍静态属性之前,我们先来看一个类的设计,有一个Account(银行账户)类,假设它有3个属性:amount(账户金额)、interestRate(利率)和owner(账户名)。在这3个属性中,amount和owner会因人而异,不同的账户这些内容是不同的,而所有账户的interestRate都是相同的。amount和o...

  • 5.实例属性与静态属性访问总结

    1.实例计算属性可以访问所有的属性。2.静态计算属性只能访问静态属性,不能访问实例属性。

  • 6.使用下标

    还记得数组和字典吗?下面的示例代码我们曾在第8章中使用过。var studentList: [String] = ["张三","李四","王五"]studentList[0] = "诸葛亮"var studentDictionary = [102 : "张三",105 : "李四", 109 : "王五"]studentDictionary[110] = "董六"在访问数...

  • 6.1.下标概念

    在Swift中,我们可以定义一些集合类型,它们可能会有一些集合类型的存储属性,这些属性中的元素可以通过下标访问。下标采用subscript关键字声明。下标也有类似于计算属性的getter和setter访问器。Swift默认名称newValue。

  • 6.2.示例:二维数组

    在Swift中没有提供二维数组,只有一维数组Array。我们可以自定义一个二维数组类型,然后通过两个下标参数访问它的元素,形式上类似于C语言的二维数组。

  • 1.实例方法

    在Swift中方法是在枚举、结构体或类中定义的函数,因此我们之前介绍的函数知识基本上适用于方法。方法是具有面向对象的特点,与属性类似,方法可以分为:实例方法和静态方法。实例方法与实例属性类似,都隶属于枚举、结构体或类的个体,即实例。通过实例化这些类型,创建实例,使用...

  • 1.1.使用规范的命名

    在Swift中,方法和函数的主要区别有以下3个。•     方法的调用前面要有主体,而函数不需要。•     方法是在枚举、结构体或类内部定义的。•     方法命名规范与函数不同。

  • 1.1.1.两种语言(Swift和Objective-C)的API

    目前苹果为iOS和Mac OS X应用开发提供的开发语言是Objective-C和Swift,同一个API两种语言共存。图13-1所示是iOS中的表视图数据源协议UITableViewDataSource。从图中可见,有两种语言(Swift和Objective-C)的API。

  • 1.1.2.SmallTalk 语法风格的多重参数

    Objective-C中的方法命名遵循了SmallTalk 语法风格,它将一个方法名分成几个部分,称为多重参数。假设定义一个按照索引插入对象(或实例)到集合里的一个方法,Objective-C中的方法定义,图13-3是Swift中的方法定义。1.方法名中使用介词。Swift中方法的名称通常用一个介词(比如wit...

  • 1.1.3.Swift多重参数方法命名实例

    Swift多重参数方法命名实例

  • 1.2.结构体和枚举方法变异

    结构体和枚举中的方法默认情况下是不能修改属性的。我们将上一节的Department定义改成结构体

  • 2.1.结构体中静态方法

    注意:1.静态方法与静态计算属性类似,它不能访问实例属性或实例方法。2.实例方法能访问实例属性和方法,也能访问静态属性和方法。self.owner语句,其中self是一个隐藏属性,指代当前类型实例,一般情况下我们不要使用它,除非属性名与变量或常量名发生冲突。

  • 2.2.枚举中静态方法

    下面我们再看一个枚举静态方法的示例,代码如下:enum Account { case 中国银行 case 中国工商银行 case 中国建设银行 case 中国农业银行 static var interestRate : Double = 0.668 //静态属性interestRate ...

  • 2.3.类中静态方法

    下面我们再看一个类方法的示例,代码如下:class Account { var owner : String = "Tony" //账户名 class func interestBy(amount : Double) -> Double { //定义静态方法interestBy r...

  • 3.方法访问总结

    实例方法可以访问所有的方法和属性。静态方法只能方法静态属性和静态方法,不能访问实例方法和属性。

  • 1.构造器

    结构体和类在创建实例的过程中需要进行一些初始化工作,这个过程称为构造过程。相反,在这些实例最后被释放的时候需要进行一些清除资源的工作,这个过程称为析构过程。结构体和类的实例在构造过程中会调用一种特殊的方法init,称为构造器。构造器init没有返回值,可以重载。在多个...

  • 1.1.默认构造器

    结构体和类在构造过程中都会调用一个构造器,即便是没有编写任何构造器,也存在一个默认构造器。

  • 1.2.构造器与存储属性初始化

    1.初始化存储属性构造器的主要作用就是初始化存储属性,我们在init()构造器中初始化存储属性width和height后,那么在定义它们时就不需要初始化了。2.初始化常量存储属性

  • 1.3.使用外部参数名

    1.外部参数名为了增强程序的可读性,Swift中的方法和函数可以使用外部参数名。在构造器中也可以使用外部参数名。构造器中的外部参数名要比一般的方法和函数更有意义,由于构造器命名都是init,如果一个对象类型中有多个构造器,我们就可以通过不同的外部参数名区分不同的构造器2.简...

  • 2.1.构造器重载概念

    Swift中函数重载的条件也适用于构造器,条件如下:•     函数有相同的名字;•     参数列表不同或返回值类型不同,或外部参数名不同。

  • 2.2.值类型构造器代理

    为了减少多个构造器间的代码重复,在定义构造器时,可以通过调用其他构造器来完成实例的部分构造过程,这个过程称为构造器代理。构造器代理在值类型和引用类型中使用方式不同,本节我们先介绍值类型构造器代理。

  • 2.3.引用类型构造器横向代理

    引用类型构造器代理就是类构造器代理。由于类有继承关系,类构造器代理比较复杂,分为横向代理和向上代理。• 横向代理类似于值类型构造器代理,发生在同一类内部,这种构造器称为便利构造器(convenience initializers)。• 向上代理发生在继承情况下,在...

  • 3.析构器

    与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程。在析构过程中也会调用一种特殊的方法deinit,称为析构器。析构器deinit没有返回值,也没有参数,所以不能重载。析构函数只适用于类类型,不能应用于枚举和结构体。类似的方法在C++中称为析构函数,不...

  • 1.从一个示例开始

    为了了解继承性,我们先看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是他定义了类Person

  • 2.构造器继承

    在一个实例的构造过程中会调用构造器这样一个特殊的方法。在构造器中可以使用构造器代理帮助完成部分构造工作。类构造器代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造器称为便利构造器。向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造器...

  • 2.1.构造器调用规则

    构造器调用规则

  • 2.2.构造过程安全检查

    第一阶段,首先分配内存,初始化子类存储属性,沿构造器链向上初始化父类存储属性,到达构造器链顶部,初始化全部的父类存储属性。第二阶段,从顶部构造器链往下,可以对类进行进一步修改存储属性、调用实例方法等处理。Swift编译器在构造过程中可以进行一些安全检查工作,这些工作...

  • 2.3.构造器继承

    Swift中的子类构造器的来源有两种:自己编写和从父类继承。并不是父类的所有的构造器都能自动继承下来,能够从父类自动继承下来的构造器,规则如下: • 规则1:如果子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器。• 规则2:如果子类提供...

  • 3.重写

    一个类继承另一个类的属性、方法、下标等特征后,子类可以重写(overriding)这些特征,overriding也有人翻译为“覆盖”,为了统一名称本书全部翻译为“重写”。下面我们就逐一介绍这些特征的重写。

  • 3.1.属性重写

    我们可以在子类中重写从父类继承来的属性,属性的重写一方面可以重写getter和setter访问器,另一方面可以重写属性观察者。通过对第12章属性的学习,我们知道,计算类型属性需要使用getter和setter访问器,而存储属性不需要。子类在继承父类后,也可以通过getter和setter访问器重写父...

  • 3.2.方法重写

    我们可以在子类中重写从父类继承来的实例方法和静态方法(又称为类方法)。方法重写发生的条件:子类与父类之间,方法名相同,参数列表,返回值类型都相同情况下。

  • 3.3.下标重写

    下标是一种特殊属性。子类属性重写是重写属性的getter和setter访问器,对下标的重写也是重写下标的getter和setter访问器。

  • 3.4.使用final关键字

    我们可以在类的定义中使用final关键字声明类、属性、方法和下标。final声明的类不能被继承,final声明的属性、方法和下标不能被重写。

  • 4.类型检查与转换

    继承会发生在子类和父类中,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类。

  • 4.2.使用as操作符

    在介绍as操作符之前,我们先了解一下对象的类型转换,并不是所有的类型都能互相转换。下面先看如下语句:let p1 : Person = Student(name : "Tom", age : 20, school : "清华大学")let p2 : Person = Worker(name : "Tom", age : 18, factory : "钢厂")...

  • 4.1.使用is操作符

    is操作符可以判断一个实例是否是某个类的类型。如果实例是目标类型,结果返回true,否则为false。

  • 4.3.使用Any和AnyObject类型

    在Swift中还提供了两种类型表示不确定类型:AnyObject和Any。AnyObject可以表示任何类的类型,而Any可以表示任何类型,包括类和其他数据类型,也包括Int和Double的基本数据类型。

  • 1.扩展

    在面向对象分析与设计方法学(OOAD)中,为了增强一个类的新功能,我们可以通过继承机制从父类继承下来一些成员,然后再根据自己的需要在子类中添加一些成员,这样我们就可以得到增强功能的新类了,但是这种方式受到了一些限制,继承过程比较繁琐,类继承性可能被禁止,有些功能也可...

  • 1.1.声明扩展

    声明扩展的语法格式如下:extension 类型名 {     //添加新功能}声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包括类、结构体和枚举,但是我们仍然可以扩展整型、浮点型、布尔型、字符串等基本数据类型,这是因为这些类型本质上也是结构体类型。打...

  • 1.2.扩展计算属性1(实例属性)

    在原类型上扩展计算属性,包括实例计算属性和静态计算属性。这些添加计算属性的定义,与普通的计算属性的定义是一样的。

  • 1.2.扩展计算属性2(静态属性)

    在原类型上扩展计算属性,包括实例计算属性和静态计算属性。这些添加计算属性的定义,与普通的计算属性的定义是一样的。

  • 1.3.扩展方法

    我们可以在原类型上扩展方法,包括实例方法和静态方法。这些添加方法的定义与普通方法的定义是一样的。

  • 1.4.扩展构造器

    扩展类型的时候,也可以添加新的构造器。

  • 1.5.扩展下标

    我们可以把下标认为是特殊的属性,可以实现索引访问属性。我们可以在原有类型的基础上扩展下标功能。

  • 2.协议

    抽象方法:只有方法的定义没有方法的具体实现。所在的类叫做抽象类,如果类中所有方法都是抽象的。如果几何图形类中所有的方法都是抽象的,那么在Swift和Objective-C中称为协议(protocol),在Java语言中称为接口,在C++中是纯虚类。协议不能被实例化的。Swift和Objective-C中...

  • 2.1.声明和遵守协议

    类、结构体和枚举类型可以声明遵守某个协议,并提供该协议所要求的属性和方法。协议定义语法如下所示:protocol 协议名 { // 协议内容}在声明遵守协议时,语法如下所示:类型 类型名 : 协议1, 协议2 { // 遵守协议内容}类型包括class、struct和enum...

  • 2.2.协议方法(1. 实例协议方法)

    协议可以要求其遵守者实现某些指定方法,包括实例方法和静态方法。这些方法在协议中被定义,协议方法与普通方法类似,但不支持变长参数和默认值参数,也不需要大括号和方法体。

  • 2.2.协议方法(2. 静态协议方法)

    2. 静态协议方法在协议中定义静态方法与在类中定义静态方法类似,方法前面要添加class关键字。那么遵守该协议的时候,遵守者静态方法前的关键字是class还是static呢?这与遵守者类型是有关系的:如果是类,关键字就是class;如果是结构体或枚举,关键字就是static。

  • 2.2.协议方法(3. 变异方法)

    3. 变异方法在结构体和枚举类型中可以定义变异方法,而在类中没有这种方法。原因是结构体和枚举类型中的属性是不可以修改的,通过定义变异方法,可以在变异方法中修改这些属性。而类是引用类型,不需要变异方法就可以修改自己的属性。在协议定义变异方法时,方法前面要添加mutatin...

  • 2.3.协议属性(1. 实例协议属性)

    协议可以要求其遵守者实现某些指定属性,包括实例属性和静态属性,在具体定义的时候,每一种属性都可以有只读和读写之分。对于遵守者而言,实现属性是非常灵活的。无论是存储属性还是计算属性,只要能满足协议属性的要求,就可以通过编译。甚至是协议中只规定了只读属性,而遵守者提...

  • 2.3.协议属性(2. 静态协议属性)

    协议可以要求其遵守者实现某些指定属性,包括实例属性和静态属性,在具体定义的时候,每一种属性都可以有只读和读写之分。对于遵守者而言,实现属性是非常灵活的。无论是存储属性还是计算属性,只要能满足协议属性的要求,就可以通过编译。甚至是协议中只规定了只读属性,而遵守者提...

  • 2.4.把协议作为类型使用

    虽然协议没有具体的实现代码,不能被实例化,但它的存在就是为了规范其他类型遵守它而设计的。在很多人看来,协议并没有什么用途,但事实上协议是非常重要的,它是面向接口编程必不可少的机制,面向接口编程系统的定义与实现应该分离。协议作为数据类型暴露给使用者,使其不用关心具...

  • 2.5.协议的继承

    一个协议继承其他协议就像是类继承一样,图16-2所示是一个继承关系的类。Person和Student都是协议,Student协议继承了Person协议,而Graduate类遵守Student协议。

  • 2.6.协议的合成

    多个协议可以临时合成一个整体,作为一个类型使用。首先要有一个类型在声明时遵守多个协议。如图16-3所示的轮船协议Ship和武器协议Weapon,它们都声明了一个可读性属性,军舰类WarShip同时遵守了这两个协议。

  • 3.扩展中声明协议

    在扩展中也可以声明遵守某个协议,语法如下所示:extension 类型名 : 协议1, 协议2 { // 协议内容}下面我们看看示例代码:protocol Editable { mutating func edit()}struct Account { var amount : Double = 10.0 ...

  • 1.Swift内存管理概述

    Objective-C的内存管理经历过两个阶段:手动引用计数内存管理(Manual Reference Counting,MRC)和自动引用计数内存管理(Automatic Reference Counting,ARC)。MRC就是由程序员自己负责管理对象生命周期,负责对象的创建和销毁。ARC就是程序员不用关心对象释放的问题,编译器...

  • 1.1.引用计数

    每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为...

  • 1.2.示例:Swift自动引用计数

    示例:Swift自动引用计数

  • 2.强引用循环

    当两个对象的存储属性互相引用对方的时候,一个对象释放的前提是对方先释放,另一对象释放的前提也是对方先释放,这样就会导致类似于“死锁”的状态,最后谁都不能释放,导致内存泄漏。这种现象就是强引用循环。

  • 3.1.弱引用

    弱引用允许循环引用中的一个对象不采用强引用方式引用另外一个对象,这样就不会引起强引用循环问题。弱引用适合于引用对象可以没有值的情况,因为弱引用可以没有值,我们必须将每一个弱引用声明为可选类型,使用关键字weak声明为弱引用。例如17.2节中介绍的人力资源管理系统,Emplo...

  • 3.2.无主引用

    无主引用与弱引用一样,允许循环引用中的一个对象不采用强引用方式引用另外一个对象,这样就不会引起强引用循环问题。无主引用适用于引用对象永远有值的情况,它总是被定义为非可选类型,使用关键字unowned表示这是一个无主引用。例如17.2节中介绍的人力资源管理系统,Employee的de...

  • 4.1.一个闭包中的强引用循环示例

    由于闭包本质上也是引用类型,因此也可能在闭包和上下文捕获变量(或常量)之间出现强引用循环问题。并不是所有的捕获变量(或常量)都会发生强引用循环问题,只有将一个闭包赋值给对象的某个属性,并且这个闭包体使用了该对象,才会产生闭包强引用循环。

  • 4.2.解决闭包强引用循环

    解决闭包强引用循环问题有两种方法:弱引用和无主引用。到底应该采用弱引用还是无主引用,与两个对象之间的选择条件是一样的。如果闭包和捕获的对象总是互相引用并且总是同时销毁,则将闭包内的捕获声明为无主引用。当捕获的对象有时可能为nil时,则将闭包内的捕获声明为弱引用。如果...

  • 1.数字类NSNumber

    在Objective-C语言中有一些基本数据类型 :int、char、float和double,但是它们都不是类,不具有方法、成员变量和属性以及面向对象的特征。为了实现“一切都是对象”的承诺,因此在Foundation框架中使用NSNumber类来封装这些数字类型。这样数字就具有面向对象的基本特征了。Swift语...

  • 使用Foundation框架

    Swift使用Foundation框架

  • 1.1.获得NSNumber实例

    不仅是NSNumber类,Foundation框架中几乎所有的类,都有两种获得实例的方式:一种是通过构造器创建,另一种是通过工厂设计模式创建。以number开头的方法是静态工厂创建方法,它通过工厂设计模式创建NSNumber对象获得实例;而以init开头的方法构造器,则通过构造器创建NSNumber对象...

  • 1.2.NSNumber对象的比较

    与比较相关方法有isEqualToNumber和compare。isEqualToNumber只是比较是否相等,而compare方法可以比较是否相等、大于和小于,它的返回值是NSComparisonResult枚举类型。

  • 2.字符串类

    在Foundation框架中,字符串类有两种:不可变字符串类NSString和可变字符串类NSMutableString。NSString是定义固定大小的字符串,NSMutableString可对字符串做追加、删除、修改、插入和拼接等操作,而不会产生新的对象。

  • 2.1.NSString类

    NSString有很多方法,下面总结的是常用属性和方法。• +stringWithString: 静态工厂创建方法创建NSString对象,NSString构造方法还有很多。• -length 返回Unicode字符的长度属性。• -stringByAppendingString: 实现了字符串的拼接,这个方...

  • 2.2.NSMutableString类

    NSMutableString是NSString的子类,有很多方法,下面总结常用的属性和方法。• -initWithCapacity: 构造器,通过指定容量构造NSMutableString对象,NSMutableString构造方法还有很多。• -insertString:atIndex: 插入字符串,不会创建新的对象。• ...

  • 2.3.NSString与String之间的关系

    字符串有可能会使用Foundation中的NSString和Swift中的String。下面我们介绍一下它们之间的关系。Swift在底层能够将String与NSString无缝地桥接起来,String可调用 NSString的全部API。因为可以在String中使用NSString,很多String API不具有的功能可以通过调用NSString API实现,但是有些时候类型转换是必要的。

  • 3.1.NSArray类

    NSArray有很多方法,下面总结常用的属性和方法。•     -initWithArray: 构造器,通过指定Array参数构造NSArray对象。•     -count 返回当前数组的长度。•     -objectAtIndex: 按照索引返回数组中的元素。•     -containsObject: 是否包含某一元素。

  • 3.2.NSMutableArray类

    NSMutableArray是NSArray的子类,它有很多方法和属性,下面总结其常用的方法和属性。• -addObject: 在数组的尾部追加一个元素。• -insertObject:atIndex: 按照索引插入一个元素。• -removeObjectAtIndex: 移除特定索引的元素。• ...

  • 3.3.NSArray与Array之间的关系

    NSArray与Array之间的关系如同NSString与String之间的关系,Swift在底层能够将它们自动地桥接起来,一个NSArray对象桥接之后的结果是[AnyObject]数组(保存AnyObject元素的Array数组)。Array

  • 4.1.NSDictionary类

    NSDictionary有很多方法和属性,下面总结其常用的方法和属性。• -initWithDictionary: 构造器,通过Swift的Dictionary创建NSDictionary对象。• -initWithObjects:forKeys: 构造器,通过键集合和值集合创建NSDictionary对象。• -count 字典...

  • 4.2.NSMutableDictionary类

    NSMutableDictionary是NSDictionary的子类,它有很多方法和属性,下面总结其常用的方法和属性。•     -setObject:forKey: 通过键和值。•     -removeObjectForKey: 按照键移除值。

  • 4.3.NSDictionary与Dictionary之间的关系

    NSDictionary与Dictionary之间的关系如同NSArray与Array之间的关系,Swift在底层能够将它们自动地桥接起来,一个NSDictionary对象桥接之后的结果是[NSObject : AnyObject]字典(键为NSObject 类型,值为AnyObject 类型的Dictionary字典)。

加载中
所属章节 资料名称 文件大小 下载
相关资料推荐

暂时还没有学习资料~

5

    1
    非常糟

    2
    很差

    3
    一般

    4
    很好

    5
    非常好

    • 0%
    • 0%
    • 0%
    • 0%
    • 0%
    加载中
    没有了哦~

    讲师介绍

    关东升

    关东升

    讲师评分:4.9

    移动开发专家,软件架构师,高级培训讲师,IT作家

    学院服务

    关注公众号领取
    免费VIP会员

    添加学院管家微信进入
    学习社群

    13709人学习过

    推荐图书

    7日学霸榜 有13709人与你一起学习

    课程介绍

    课程大纲

    学习资料

    学员评价

    ¥ 99.00

    课程评价

    发表客观评价,上限可得35学分(会员可得70学分)

    Swift语言视频教程入门与提高(下)视频课程

    该课程已有 人评价

    课程与描述相符

    老师的讲解表达

    老师的答疑服务

    匿名

    在线
    客服
    在线
    客服

    下载Android客户端

    下载iphone 客户端

    关注官方微信

    返回
    顶部