iOS开发 - 语言基础集
分类专栏简介还没想好 ...
码海前行的猪
吃饱了 才有力气干活 !
展开
-
iOS Swift No.26 - 访问控制4
第二十六章 访问控制7. Initializers (构造器)自定义构造器的访问级别可以低于或等于其所属类型的访问级别。唯一的例外是请求构造器(required initializer),它的访问级别必须和所属类型的访问级别相同。如同函数或方法的参数,构造器参数的访问级别也不能低于构造器本身的访问级别。和在默认构造器章节介绍的那样,Swift 会为结构体和类提供一个默认的无参数的构造器,只要它们为所有存储型属性设置了默认初始值,并且未提供自定义的构造器。原创 2020-08-31 22:57:57 · 191 阅读 · 1 评论 -
iOS Swift No.26 - 访问控制3
第二十六章 访问控制5. Subclassing (子类)我们可以将任何可以在当前上下文中访问的类划分子类,并且划分的子类要必须定义在相同的模块内。同样的我们可以以划分open类的方法将任何定义在不同模块中的类划分为子类。一个子类不可以比它的父类访问级别高。例如,我们不可以将内部访问的父类写成公共访问的子类。You can subclass any class that can be accessed in the current access context and that’s defined原创 2020-08-30 23:15:01 · 203 阅读 · 1 评论 -
iOS Swift No.26 - 访问控制2
第二十六章 访问控制3. Access Control Syntax (访问控制语法)在实体的介绍符之前我们可以用这五个修饰符(open,public,internal,fileprivate或private)来定义实体的五种访问级别。类型的访问控制级别同样也会影响类型成员(属性,方法,构造器和下标)的默认访问级别。如果将类型的访问级别定义为私有或文件私有,那么该类型的成员访问级别也将会被定义为私有或文件私有。如果我们将一个类型的访问级别定义为内部或公共(或使用了一个默认的内部访问级别并没有明确原创 2020-08-28 20:19:27 · 185 阅读 · 1 评论 -
iOS Swift No.26 - 访问控制1
第二十六章 访问控制swift的访问控制模型(model)是基于模块(modules)和源文件(source files)的概念而来的。模块是一个独立的代码单元。框架(framework)或应用程序(application)会作为一个独立的模块来构建和发布,在swift中可以用关键字`import`来导入另一个模块。在Xcode中用swift创建的每一个目标(app bundle,framework)都可以被看作是独立的模块来处理。如果我们把app中的代码组合在一起看作为一个独立的框架,当然原创 2020-08-23 18:03:54 · 209 阅读 · 1 评论 -
iOS Swift No.25 - 内存安全3
第二十五章 内存安全4. Conflicting Access to Properties (属性中的冲突访问)类型如结构体,元组,和枚举都是有单个值组成的,就像结构体的属性或者元组的元素。因为他们是值类型,变动任何一处值将会改变整个结果值。这就意味着给属性的读取和写入访问需要请求对整个结果值的写入和读取访问。例如,给元组中的元素重叠写入访问将会产生冲突。var playerInformation = (health: 10, energy: 20)balance(&playerInform原创 2020-08-14 20:55:15 · 1057 阅读 · 1 评论 -
iOS Swift No.25 - 内存安全2
第二十五章 内存安全3. Conflicting Access to self in Methods (方法中的self冲突访问)在方法调用期间,结构体中的可变方法有一个写入访问给self的,举个例子,考虑我们在玩一个游戏,每一个玩家都有一定量的健康值,收到攻击健康值就会减少,使用特殊技能能量值就会增加,struct Player { var name: String var health: Int var energy: Int static let maxHeal原创 2020-08-14 15:04:14 · 156 阅读 · 1 评论 -
iOS Swift No.25 - 内存安全1
第二十五章 内存安全默认情况下,swift语言会阻止我们代码中的一些不安全行为,举个例子,swift确保变量在使用前一定要先构造好,内存在某个变量被释放之后并不能读取该变量,并且会检查超范围的数组的索引值,预防发生内存读取数组中超范围的索引值。Swift同样会确保多次读取内存中相同的区域而不会发生冲突,通过请求修改内存中的一个位置而达到拥有对内存的独占访问权。因为swift是自动管理内存的。大多数情况下我们不需要思考访问内存,然而,我们需要理解什么时候会发生冲突时非常重要的,所以我们在写代码的时候要避免原创 2020-08-11 00:30:39 · 194 阅读 · 1 评论 -
iOS Swift No.24 - 自动引用计数5
第二十四章 自动引用计数6. Resolving Strong Reference Cycles for Closure ( 解决闭包引起的强引用循环 )我们可以定义一个捕获列表来作为闭包的一部分的方式来解决闭包和类实例之间引起的强引用循环,捕获列表定义了一些使用的规则,当在闭包体里面捕获到一个或多个引用循环的时候。作为一个两个实例之间的强引用循环,我们可以每一个捕获到的引用来当作一个弱引用或无主引用而不是一个强引用。...原创 2020-08-09 00:00:45 · 174 阅读 · 1 评论 -
iOS Swift No.24 - 自动引用计数4
第二十四章 自动引用计数5. Strong Reference Cycles for Closure (闭包中的强引用循环)上面的例子中的两个类的实例属性相互为对方保留一个强引用,所以我们就能看出来强引用循环是如何产生的,同样也能看出来上面我们如何使用弱引用和无主引用来断开强引用循环。一个强引用循环同样也可以产生,如果我们将一个闭包分配给类的实例属性,闭包体捕获的是类的实例。这种闭包体捕获类实例可能发生是因为闭包体它读取了实例的属性,就像self.someProperty,或者该闭包调用了实例中的方法原创 2020-08-03 14:48:37 · 198 阅读 · 1 评论 -
iOS Swift No.24 - 自动引用计数3
第二十四章 自动引用计数4.2 Unowned Optional Reference (无主可选引用)我们可以把通向类的可选引用看作无主可选引用。在ARC关系模型中,一个无主可选引用和一个弱引用都可以使用在相同的上下文中。两者之间使用不同之处就在于,当我们在使用无主可选引用的时候,我们就可以确定将要引用的对象是有效或者该对象被设置为nil了。下面这个例子,就是追踪学校中部门所授予的课程信息。class Department { var name: String var courses原创 2020-07-31 23:01:15 · 221 阅读 · 1 评论 -
iOS Swift No.24 - 自动引用计数2
第二十四章 自动引用计数4. Resolving Strong Reference Cycles Between Class Instances (化解类实例间的强引用循环)在swift语言中,提供了两种可以解决强引用循环的方法,就是当我们应用在类类型的属性中的时候,有弱引用(weak reference)和无主引用(unowned reference)两种特殊的引用方法,弱引用和无主引用都会使引用循环(reference cycle)中的一个实例引用到另一个其他的实例,而并不会强烈地保留在该实例上。原创 2020-07-31 01:32:06 · 182 阅读 · 1 评论 -
iOS Swift No.24 - 自动引用计数1
第二十四章 自动引用计数swift使用自动引用计数Automatic Reference Counting (ARC)来追踪和管理我们App里的内存使用情况,在大多情况下,在swift里ARC就意味着内存管理是“刚刚开始工作”,并且我们不需要考虑内存它是如何如何工作如何如何管理的,ARC会通过类实例来自动释放内存,当这些类实例不在被需要的时候。然而,在某些情况下,ARC会请求有关代码片段之间的关系的更多信息,来进一步为我们管理好内存,将会在本章节中描述各种情况,并且会展示给我们ARC是如何管理原创 2020-07-22 23:39:52 · 261 阅读 · 1 评论 -
iOS Swift No.23 - 不透明类型2
第二十三章 不透明类型3. Differences Between Opaque Types and Protocol Types ( 不透明类型和泛型类型的区别 )返回一个不透明类型看起来和使用协议类型作为函数的返回类型是比较相似的。 但是两个种类的返回类型不的地方在于它们各自保留的返回类型标识。一个不透明类型引用的是一个特殊的类型,即便是函数的调用者也不能看到是哪一个类型,一个协议类型可以引用任何一个遵循协议的类型。简单来讲,协议类型给我们更多关于它存储值的潜在类型的灵活性。而不透明类型可以是我们更原创 2020-07-19 00:01:37 · 538 阅读 · 1 评论 -
iOS Swift No.23 - 不透明类型1
# 第二十三章 不透明类型一个带有不透明类型的函数或方法都会隐藏其返回值类型的信息。返回值描述在支持的协议中,隐藏类型信息在模块和调用模块的代码之间的边界上很有用,因为返回值的基础类型可以保持私有。与返回类型为协议类型的值不同,不透明类型保留类型标识 - 编译器可以访问类型信息,但模块的客户端不能访问类型信息。原创 2020-07-17 15:57:51 · 213 阅读 · 1 评论 -
iOS Swift No.22 - 泛型5
第二十二章 泛型11. Contextual Where Clauses (前后关系的where子句)我们可以写一个没用类型约束的泛型where子句作为声明的一部分。当前我们正应用于where子句的上下文中。举个例子,在泛型类型的下标里写泛型where子句或在泛型类型的扩展里写一个方法。Container结构体是一个泛型,下面的例子中指明了where子句满足哪些约束才可以在新的方法上使用。extension Container { func average() -> Double whe原创 2020-07-13 01:26:46 · 186 阅读 · 1 评论 -
iOS Swift No.22 - 泛型4
第二十二章 泛型9. Generic Where Clauses (泛型where子句)类型约束在上面描述过了 使我们在关联的泛型方法,下标或类型上面定义类型参数的要求。为关联类型定义要求同样也是非常实用的。我们可以通过定义一个泛型where子句的方式来为关联类型定义要求。一个泛型where子句要求关联类型必须遵循某个协议,或者某个类型参数和关联类型必须是相同的。可以通过将where关键字紧跟在类型参数列表后面来定义where子句,where子句后跟一个或者多个针对关联类型的约束,以及一个或多个类型参数原创 2020-07-12 23:53:51 · 171 阅读 · 1 评论 -
iOS Swift No.22 - 泛型3
第二十二章 泛型8. Associated Type (关联类型)当我们在定义协议的时候,定义一个或者多个关联类型作为协议定义的一部分是非常有用的,关联类型会给出一个占位符名称,该占位符名称会作为协议定义的一部分,知道协议被采用的时候,实际为关联类型使用的类型才会被使用。关联类型可以用关键字associatedtype来加以说明。8.1 Associated Types in Action (实践中的关联类型)下面是一个协议Container,它声明了一个关联类型Item。protocol Con原创 2020-07-10 14:26:08 · 245 阅读 · 1 评论 -
iOS Swift No.22 - 泛型2
第二十二章 泛型6. Extending a Generic Type (扩展泛型类型)当我们扩展一个泛型类型的时候,并不需要提供类型参数列表作为扩展定义的一部分。 相反的,原类型定义中的类型参数在扩展体内依然是有效的,也就是说不需要我们我们在扩展定义里面在此定义类型参数,扩展体里的原类型参数可以作为当前扩展的类型参数使用。下面这个例子是一个在泛型Stack类型上面扩展添加了一个只读的计算型属性topItem,该属性会返回栈最顶端的那个元素而不是从栈里面移除。extension Stack { /原创 2020-07-10 10:17:42 · 150 阅读 · 1 评论 -
iOS Swift No.22 - 泛型1
第二十二章 泛型泛型代码可以是我们写出灵活的和可重复使用的适用于任何类型的函数(function)或类型(type)我们可以在写代码的时候避免代码的重复和以一个简洁明了和抽象的人的方式来表达想要实现的代码。泛型是Swift语言最强大的一个特性,并且许许多多Swift标准库都使用泛型来构建的。 事实上,泛型贯穿了整个swift语法指导书,只是你没有意识到。 举个例子,swift中的数组和字典类型其实都是泛型集合(generic collection),创建一个Int值的数组,或着一个String值的数组原创 2020-07-05 22:59:58 · 247 阅读 · 1 评论 -
iOS Swift No.21 - 协议5
可选协议要求我们可以为协议定义一个可选的要求(optional requirement),这些要求可以勿需被所遵循的协议类型所实现,我们可以在协议的定义中以添加`optional`修饰符作为前缀的方法作为这个协议的可选要求。当我们写的代码要与objective-c作交互的时候,要加上`@objc`属性,需要注意的是`@objc`协议只能被继承于Objective-c的类所采用或`@objc`的类。而`@objc`协议不能内结构体原创 2020-06-27 23:07:36 · 187 阅读 · 1 评论 -
iOS Swift No.21 - 协议4
第二十一章 协议12. Protocol Composition (协议组合)有些时候需要在同一时间来请求一个类型来遵循多个协议,所以我们可以把多个协议组合在一起形成一个单一的请求,这个过程我们称之为协议组合。如果说我们定义一个暂时性的本地协议,并且这个协议在一个组合里面请求多个协议的时候,这个时候协议组合并不会定义新的协议类型。协议组合有这样的一个形式SomeProtocol & AnotherProtocol,随意我们可以添加很多个协议只要符合当前这个协议组合的形式就行,并用&符号原创 2020-06-16 23:40:23 · 211 阅读 · 1 评论 -
iOS Swift No.21 - 协议3
第二十一章 协议8. Adding Protocol Conformance with an Extension (通过扩展添加协议一致性)可以通过扩展已有的类型来采用和遵循一个新的协议,即使我们对该已有类型的源代码没有访问权限时。通过扩展可以给已有的类型添加一些新的属性,方法或下标。 所以可以通过扩展协议也可以为已有的类型添加新的属性等,更多扩展相关内容在扩展章节中有详细介绍。下面这个协议TextRepresentable,任何表达文本的任何类型都可以实现这个协议,可以是文本本身也可以是当前文本的状原创 2020-06-14 21:45:27 · 222 阅读 · 1 评论 -
iOS Swift No.21 - 协议2
第二十一章 协议6. Protocols as Types (协议当作类型)协议实际上并不能自行实现任何功能,尽管如此我们可以把协议当作普通类型那样在我们的代码中使用。把协议当作类型使用有些时候我们称之为 "存在类型" (existential type),来自于 “ 如果存在某个类型T,那么这个类型T就会遵循某个协议 ”。原创 2020-05-29 14:42:40 · 891 阅读 · 1 评论 -
iOS Swift No.21 - 协议1
第二十一章 协议协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法,属性,以及其他需要的东西。类,结构体或枚举都可以遵循协议,并为协议定义的这些要求提供具体实现。某个类型能够满足某个协议的要求,就可以说该类型遵循这个协议。除了遵循协议的类型必须实现的要求外,还可以对协议进行扩展,通过扩展来实现一部分要求或者实现一些附加功能,这样遵循协议的类型就能够使用这些功能。原创 2020-05-27 17:16:40 · 271 阅读 · 1 评论 -
iOS Swift No.20 - 扩展
第二十章 扩展 (extensions) - 就是给现有的类,结构体,枚举或者协议类型添加新的功能。包括没有读取权限的情况下获取原始源代码的扩展类型的能力(逆向建模),swift中的扩展和oc里面的分类较为相似,但与oc里的分类不同的是swift里面的扩展没有名字。原创 2020-05-24 11:31:15 · 364 阅读 · 1 评论 -
iOS Swift No.19 - 嵌套类型
第十九章 嵌套类型 枚举通常情况下是用来支持已创建一个特定的类或结构体的功能的,同样地,枚举可以方便的定义工具类或结构体,从而被某个复杂的类型所使用。为了实现这种功能,Swift 允许你定义嵌套类型,可以在支持的类型中定义嵌套的枚举,类和结构体。要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的 `{}` 内,而且可以根据需要定义多级嵌套。原创 2020-05-21 19:58:11 · 229 阅读 · 1 评论 -
iOS Swift No.18 - 类型转换
第十八章 类型转换类型转换是一种用来检查类型的实例,或着把这个实例看作一个不同与它自己类层级中的一个父类或子类。Type casting is a way to check the type of an instance, or to treat that instance as a different superclass or subclass from somewhere else in its own class hierarchy.类型转换在swift里面用is和as运算符来表示。这两个运算符原创 2020-05-20 06:20:16 · 366 阅读 · 1 评论 -
iOS Swift No.17 - 错误管理
第十七章 错误管理错误管理是对我们的程序中产生的错误进行的一种响应和恢复的过程。swift语言支持在runtime的时候 抛出(throwing),获取(catching),传播(propagating),和操作(manipulating)可恢复的错误。一些代码的执行不能完全保证在执行完毕之后可以产出有用的输出。可选类型通常是用来表达某个值的缺失。当某次执行失败的时候。让我们来理解对引起失败的原因是很有帮助的,所以在我们的代码中要进行对应的响应。举个例子,当我们从一个磁盘中的某个文件进行读取和处理数据原创 2020-05-18 21:42:01 · 388 阅读 · 1 评论 -
iOS Swift No.16 - 可选链
第十六章 可选链可选链是查询和调用在属性,方法或下标的一个当前可能为nil的一个可选类型。如果说这个可选类型现在含有一个值,那么就回成功调用该类型中的属性,方法或下标。如果这个可选类型是nil那么在调用属性,方法或下标的时候回返回nil,多个查询指定可以链接在一起,如果说该链接中的任何一个链接返回nil,那么整个可选链就会失败。1. Optional Chaining as an Alternative to Forced Unwrapping (可选链可作为强制展开使用)我们可以添加(?)在某个类型原创 2020-05-17 04:28:58 · 217 阅读 · 1 评论 -
iOS Swift No.15 - 析构
第十五章 析构析构(deinitialization)是一个对类的实例释放的一个过程,在析构的过程中我们会调用析构器(deinitializer)来参与类实例的释放,析构器只有在某个类的实例被释放前才会被调用。我们用deinit关键字介绍并引出这个这个析构器,这一点和构造过程中调用的构造器的用法写法是一样的。并且析构器只能在类的实例中使用。1. How Deinitialization Works (析构的过程)...原创 2020-05-13 07:52:44 · 295 阅读 · 1 评论 -
iOS Swift No.14 - 构造 6
第十四章 构造6.4 Overriding a Failable Initializer (重写一个失败构造器)我们可以在一个子类里面重写父类的失败构造器,就像重写其他构造器那样,这样以来可以用子类的非失败构造器来重写父类里面的失败构造器。要想重写一个失败构造器,那么我们就不能在定义子类里面包含一个失败构造器。因为我们要用子类里面的非失败构造器来重写父类里面的构造器呢。需要注意的是用子类里面的非失败构造器重写一个父类里面的失败构造器的时候,要向上代理父类里买呢的构造器,就只能用强制展开父类里面失败构在器原创 2020-05-11 08:28:08 · 757 阅读 · 1 评论 -
iOS Swift No.14 - 构造 5
我们有时候可以为一个类,结构体或者枚举定义一个可失败的构造器。也就是说为类,结构体或者枚举属性值在构造过程中可能会失败,这种失败的行为可能会被一个在构造过程中传入一个无效的参数值,一个该类型所需要的外部资源或其他可预防构造过程成功的条件所触发。这三种行为均可导致该类型的构造器失败,原创 2020-05-11 06:07:10 · 229 阅读 · 1 评论 -
iOS Swift No.14 - 构造 4
第十四章 构造5.5 Initializer Inheritance and Overriding (构造器的继承和重写)默认情况下,swift子类里面的构造器不会继承父类里面的构造器,swift的这种继承机制可以有效的预防一个父类的简单构造器被一个更精细的子类继承,并被错误地用来创建子类的实例。假如你希望自定义的子类中能提供一个或多个跟父类相同的构造器,你可以在子类中提供这些构造器的自定义...原创 2020-05-08 03:37:40 · 269 阅读 · 1 评论 -
iOS Swift No.14 - 构造 3
类的所有存储属性 - 包括其他任何一个继承自父类的属性 - 必须在构造的过程中分配一个初始值。swift语言为类类型定义了两种构造器用来确保所有的存储属性可以接受初始值,这两种构造器分别是指定构造器(`designated initializer`)和便利构造器(`convenience initializer`)。原创 2020-05-05 18:32:45 · 472 阅读 · 1 评论 -
iOS Swift No.14 - 构造 2
第十四章 构造3. Optional Property (可选属性)如果我们自定义的一个类型有一个存储型属性,这个存储型属性逻辑上是可以没有值,很大程度上 这个值在构造过程中不能被设置,或者是因为这个值在这个点不允许有值。所以针对这种情况我们要在定义属性的时候,把这个类型的值定义为可选的类型,这个时候可选类型的值就会被自定初始化为一个nil的值了。说明了这个值在构造过程或初始化的时候可愈允许处...原创 2020-05-02 20:03:21 · 241 阅读 · 1 评论 -
iOS Swift No.14 - 构造 1
第十四章 构造构造是一个为类,结构体或和枚举的实例作准备使用的一个过程。有了类,结构体或者枚举实例的构造过程之后呢,才能更好的使他们实例的存储属性更好的设置初始值。也就是说我们要想使用某个类型的一个新的实例就必须先要对他们的存储属性构造一个初始值。这就是构造的由来以及作用。...原创 2020-04-25 08:25:16 · 271 阅读 · 1 评论 -
iOS Swift No.13 - 继承
第十三章 继承一个类可以继承方法,属性和来自于其他类的特性。当一个类继承另一类的时候,继承的类叫做子类,被继承的类叫做父类,类的继承是一个最基本的行为相比较于swift里面的类和其他类型的不同。...原创 2020-04-20 03:28:55 · 479 阅读 · 1 评论 -
iOS Swift No.12 -下标
第十二章 下标类,结构体和枚举都可以用来定义下标,下标(subscripts)是用来读取集合(collectrion),列表(list)或序列(sequence)中的成员元素(member elements)的一种快捷方式。我们可以使用下标来设置和检索集合列表和序列中元素的值,而并非需要其他单独的方法来设置和检索元素的,举个例子在Array的实例中以索引位置index的方式来读取array里的元...原创 2020-04-13 18:11:18 · 403 阅读 · 2 评论 -
iOS Swift No.11 - 方法 2
第十一章 方法2. Type Method (类型方法)方法中的实例方法已经在上个章节中表述过了,实例方法是一个调用某个特定类型的实例里面的一种方法,也可以定义一个调用在类型本身的方法(you can also define methods that are called on the type itself),这种调用形式的方法我们称之为类型方法(Type Method)。用static关...原创 2020-04-09 02:27:03 · 260 阅读 · 1 评论 -
iOS Swift No.11 - 方法 1
第十一章 方法方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法 (Instance method),实例方法为某些给定类型实例封装了特殊任务和功能。类,结构体和枚举都可以用来定义类型方法(Type Method),而类型方法与类型本身相关联,类型方法和Objective-C里面的Class Method类似。在Swift里面结构体和枚举可以定义方法这是与C和Objective...原创 2020-04-09 00:49:56 · 260 阅读 · 1 评论