07 2016 档案
摘要:下面这张UML图(该图为网上找到的),比较形象地展示了各种类图关系: 对于继承、实现这两种关系没多少疑问,它们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的,前面也提到,这几种关系都
阅读全文
摘要:组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;它同样体现整体与部分间的关系,但此时整体与部分是不可分的,它们具有统一的生存期,整体的生命周期结束也就意味着部分的生命周期结束,部分对象与整体对象之间具有同生共死的关系,组合关系中的部分,是不能在
阅读全文
摘要:聚合关系是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系,此时整体与部分之间是可分离的,它们可以具有各自的生命周期。比如计算机与CPU、公司与员工的关系等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。 在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部
阅读全文
摘要:关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。它体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友。这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,关联可以是单向、
阅读全文
摘要:依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就
阅读全文
摘要:实现关系是用来描述接口和实现接口的类或者构建结构之间的关系,接口是操作的集合,而这些操作就用于规定类或者构建结构的一种服务。 在接口和类之间的实现关系中,类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。 UML示例图如下所示:
阅读全文
摘要:这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成。现在重新整理编写。计划从基础知识六大设计原则、设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23种设计模式进行分析。由于本人编写本系列文章时也是边学习边整理,因此持续的时间会比较长,更多的是希望和
阅读全文
摘要:1.定义 一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。 2.定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的。那么如何应对需求变化的情况?这就是开放-关闭原则要谈的。 开放-封闭原则的思想就是设计的时候,尽量让设计的类做好后就不再修改,如果有新的需
阅读全文
摘要:1.定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle)。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 广义的迪米特法则定义:一个模块设计得好坏
阅读全文
摘要:1.定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名。 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换成o2时,程序的行为不发生任何变化,那么T2为T1的子类。 定义2:所有引用父类的地方都必须能够
阅读全文
摘要:1.定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖细节;细节应该依赖抽象。 2.定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层模块(原子操作的模块),两者都应该依赖于抽象。我们平时常说的“针对接口编程,不要针对实现编程”就是依
阅读全文
摘要:1.定义 客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖应该建立在最小的接口上。 2.定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上; 一个接口代表一个角色,不应该将不同的角色都交给一个接口,因为这样可能会形成一个臃肿的大接口; 不应该强迫客户依赖它们从来不用的
阅读全文
摘要:1.定义 就一个类而言,应该仅有一个引起它变化的原因。 2.定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个原因使得一个类发生变化,也就是一个类只负责一种职责的工作。 3.优点 类的复杂度降低,一个类只负责一个功能,其逻辑要比负责多项功能简单的多; 类的可读性增强,阅读起来轻松; 可维
阅读全文
摘要:什么是泛化关系?用一个例子简单的说:假设A是B和C的父类,B、C具有公共类(父类)A,说明A是B、C的一般化(概括,也称泛化),B、C是A的特殊化。 在编程上,泛化关系(Generalization)就是我们常说的继承关系,称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,
阅读全文
摘要:导航栏和TabBar结合的项目,在我们平常开发中会经常看到,下面我们通过自定义的TabBar来实现一个导航和TabBar结合的Demo。 1.自定义TabBar 2.怎么使用?
阅读全文
摘要:自定义视图是在项目开发中经常会面临的工作,通过对视图进行封装,能达到更好的复用性,并使得VC里面的逻辑更加清晰。本篇将对实际项目中常用的图片轮播进行封装。 1.先从源码看起 首先,定义了一个枚举类型,用于区分图片的存储类型:网络图片还是本地图片。 然后对图片轮播类进行了功能封装。 最后,通过扩展来遵
阅读全文
摘要:和OC一样,Swift中也可以添加运行时属性。下面将提供一个完整的例子,演示如何给按钮点击事件添加运行时属性。 1.示例 2.示例说明 在Swift中,闭包不属于AnyObject,因此,需要做一个相互转换。如下所示: 使用方式如下:
阅读全文
摘要:实际项目开发中,我们经常会需要对系统的UI控件等进行封装,以达到统一修改、重复代码少、复用性高等效果。OC中,我们一般通过Category来给现有类添加方法;而在Swift中,我们使用Extension来扩展现有类的功能。 1.先看一个完整的扩展示例 【注意】:需要注意一下这里的方法参数,都是可选类
阅读全文
摘要:1.回忆一下OC中的单例实现 + (instancetype)sharedManager; 2.Swift中的单例实现 在Swift中,有多种方式可以创建单例,比较常用也推荐使用的是如下的方式: 提供一个空的私有init()方法,可以保证单例是真正唯一的,避免外部对象通过访问init方法创建单例类的
阅读全文
摘要:在OC中,我们经常会用typedef关键字来声明Block,例如: 在Swift中,typedef关键字替换成了typealias。实际项目开发中,我们常用的闭包宏定义如下:
阅读全文
摘要:Swift 中没有宏定义,苹果建议使用let 或者 get 属性来替代宏定义值。虽然没有#define,但我们仍然可以使用 #if 并配合编译的配置来完成条件编译。下面会列出Swift项目开发中的一些常用宏定义,并提供源码。 1.常用字体宏定义 2.常用颜色宏定义 3.常用变量/方法定义 【注意】:
阅读全文
摘要:经历前面三部分的学习之后,我们对于Swift的有了基本的了解,知道它的基础语法,也知道了类、结构体、枚举、协议、扩展等等内容。但知道上面这些内容,并不代表我们就能很好的进行实际的项目开发了,本部分内容将手把手的教你进行Swift的项目开发。 1.新建Swift项目 打开XCode,选择【File】
阅读全文
摘要:访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别。这个特性可以让我们隐藏代码的一些实现细节,并且可以为其他人可以访问和使用的代码提供接口。 你可以明确地给单个类型(类、结构体、枚举)设置访问级别,也可以给这些类型的属性、方法、构造器、下标等设置访问级别。协议也可以被限定在一定的范围内使用
阅读全文
摘要:泛型代码让你能够根据自定义的需求,编写出适用于任意类型、灵活可重用的函数及类型。它能让你避免代码的重复,用一种清晰和抽象的方式来表达代码的意图。 1.泛型所解决的问题 上面的函数实现了交换两个 Int 变量的值的功能,但是它只能交换 Int 值,如果你想要交换两个 String 值或者 Double
阅读全文
摘要:协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法、属性,以及其他需要的东西。类、结构体或枚举都可以采纳协议,并为协议定义的这些要求提供具体实现。某个类型能够满足某个协议的要求,就可以说该类型“符合”这个协议。 除了采纳协议的类型必须实现的要求外,还可以对协议进行扩展,通过扩展来实现一部分
阅读全文
摘要:扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )。扩展和 Objective-C 中的分类类似。 Swift 中的扩展可以: 1.扩展语法 如果通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都
阅读全文
摘要:枚举常被用于为特定类或结构体实现某些功能。类似的,枚举可以方便的定义工具类或结构体,从而为某个复杂的类型所使用。为了实现这种功能,Swift 允许你定义嵌套类型,可以在支持的类型中定义嵌套的枚举、类和结构体。 要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的{}内,而且可以根据需要定义
阅读全文
摘要:类型转换在 Swift 中使用 is 和 as 操作符实现。is用于判断实例的类型,as用于转换实例的类型。 1.从一个示例谈起 2.Any 和 AnyObject 的类型转换 Swift 为不确定类型提供了两种特殊的类型别名:
阅读全文
摘要:错误处理(Error handling)是响应错误以及从错误中恢复的过程。Swift 提供了在运行时对可恢复错误的抛出、捕获、传递和操作的一流支持。 某些操作无法保证总是执行完所有代码或总是生成有用的结果。可选类型可用来表示值缺失,但是当某个操作失败时,最好能得知失败的原因,从而可以作出相应的应对。
阅读全文
摘要:可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会成功;如果可选值是nil,那么调用将返回nil。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil。 Swift 的可选链式调用和 Ob
阅读全文
摘要:Swift 使用自动引用计数(ARC)机制来跟踪和管理应用程序的内存。通常情况下,Swift 内存管理机制会一直起作用,我们无须自己来考虑内存的管理。ARC 会在类的实例不再被使用时,自动释放其占用的内存。 引用计数仅仅应用于类的实例。结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储
阅读全文
摘要:析构器只适用于类类型,当一个类的实例被释放之前,析构器会被立即调用。析构器用关键字deinit来标示. 1.析构过程 2.示例
阅读全文
摘要:构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置实例中每个存储型属性的初始值和执行其他必须的设置或初始化工作。 与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化
阅读全文
摘要:一个类可以继承另一个类的方法、属性和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。 在 Swift 中,类可以调用和访问超类的方法、属性和下标,并且可以重写(overri
阅读全文
摘要:下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。 一个类型可以定义多个下标,通过不同索引类型进行重载。下标不限于一维,也可以定义具有多个入参的下标满足自定义类型的需求。 1.下标语法(关键字:subscript
阅读全文
摘要:方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。 1.实例方法 实例方法是属于某
阅读全文
摘要:属性将值跟特定的类、结构或枚举关联。存储属性存储常量或变量作为实例的一部分,而计算属性计算(不是存储)一个值。计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体。 存储属性和计算属性通常与特定类型的实例关联。但是,属性也可以直接作用于类型本身,这种属性称为类型属性。 另外,还可以定义属性观
阅读全文
摘要:类和结构体是构建代码所用的一种通用且灵活的构造体。我们可以使用完全相同的语法规则来为类和结构体定义属性(常量、变量)和添加方法,从而扩展类和结构体的功能。 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系
阅读全文
摘要:枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数。 1.枚举语法 示例: 2.使用 Switch
阅读全文
摘要:闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。 闭包采取如下三种形式之一: 闭包一般形式语法: OC中的闭包语法:^ 返回值类型 参数列表 表达式。示例如下: 1.闭包表
阅读全文
摘要:函数是用来完成特定任务的独立的代码块。 Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函
阅读全文
摘要:Swift提供了多种流程控制结构,包括可以多次执行任务的while循环,基于特定条件选择执行不同代码分支的if、guard和switch语句,还有控制流程跳转到其他代码的break和continue语句。 Swift 还增加了for-in循环,用来更简单地遍历数组(array),字典(diction
阅读全文
摘要:Swift 语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组(Arrays)是有序数据的集合。集合(Sets)是无序无重复数据的集合。字典(Dictionaries)是无序的键值对的集合。 如果创建一个Arrays、Sets或Dictionaries并
阅读全文
摘要:String是例如"hello, world","albatross"这样的有序的字符类型的值的集合。通过String类型来表示。 一个String的内容可以用许多方式读取,它包括一个字符值的集合。 1.字符串字面量 字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集。 2.初始化空
阅读全文
摘要:Swift 支持大部分标准 C 语言的运算符,分为一元、二元和三元运算符。 一元运算符对单一操作对象操作(如 -a)。一元运算符分前置运算符和后置运算符,前置运算符需紧跟在操作对象之前(如 !b),后置运算符需紧跟在操作对象之后(如 i++)。 二元运算符操作两个操作对象(如 2 + 3),是中置的
阅读全文
摘要:1.常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。常量的值一旦设定就不能改变,而变量的值可以随意更改。 Swift 不强制要求在每条语句的结尾处使用分号(;),当然,也可以按照自己的习惯添加分号。有一种情况下必须要用分号,即在同一行内写多条独立的语句。 2.类型标注
阅读全文
摘要:本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理。如对原版感兴趣,可以直接单击链接阅读和学习。 第一部分 基础篇 1.基本介绍 2.运算符 3.字符串和字符 4.集合 5.控制流 6.函数 7.闭包 8.枚举 第二部分 进
阅读全文