素材:Language Guide

初次接触 Swift,建议先看下 A Swift Tour,否则思维转换会很费力,容易卡死或钻牛角尖。

同样是每一章只总结3个自己认为最重要的点。这样挺好!强迫你去思考去取舍。以后再看,也方便快速重建记忆。

注意: 个人笔记,仅供参考,不保证严格意义上的正确性。

The Basics

* 整数,优先使用 Int,浮点数,优先使用 Double
* 可以使用 0b 表示二进制,可以在数字中间插入可读字符 _,如 182_3880_25
* as 仅用于兼容类型间的相互转换.非兼容类型的转换,由各个类自己的初始化方法实现.

Basic Operators

* 空格对操作符的影响很大,如 a??b 应该写作 a ?? b, 因为 a? 也是一个有效的操作符.
* a ?? b 返回的是 a unwrap 后的值或 b 的值. ?? 比 js 的 || 好使多了,因为前者能准确区分零值和nil值.只有nil值时,才需要使用默认值.
* names[0..<2] 本质上,是得到了一个数组. ==> 本质上,应该是 array 的[]操作符,重载后,支持了 range 参数.

Strings and Characters

* 多行字符串的起始偏移,是根据末尾的 """ 的偏移 来判定的.
* collection 类型,都有自己的 index struct.String 中涉及的增删改查操作,适用于所有 collection 类型.
* SubString 的增删改查,只是一个原有 String 上的游标操作.

Collection Types

* collection type 是struct,是复制传值,即使只是 a = b
* 操作符重载之后,可以支持数组相加(+)等操作,可以显著代码的可读性和简洁性
* 能在编译器推导出的模板类型部分,都可以省略实例类型部分

Control Flow

* switch case 匹配中的 range,也支持源于 String.index 的range
* where 充当一个查询子句的角色
* \#available的确可以让API可用性检查,更方便.

Functions

* 可变字符串的 label 是可以在函数声明时,由自己指定的. ==> 可变参数,不需要是最后一组参数
* inout 有点像是指针传值;不同的是,在函数内使用时,不需要处理指针解引用操作,直接一个普通 var 变量使用即可.
* 参数默认是 let 不可变类型,不允许修改

Closures

* function type 不包含 label 部分 --> 传递function时,其label部分会被自动忽略. -->  在绝大部分场景中,二者是兼容的.
* closure 可以省略参数类型,是因为类型推导机制的存在 --> 尾闭包,可以省略 ();
* 用作函数参数的闭包,如果想在函数外使用,需要额外加 @escaping 标记 ;@autoclosure 会自动补全用作函数参数的闭包的{}符号 --> @autoclosure 标记的闭包,是有可能和其他一般参数标记的参数,函数签名重复的.

Enumerations

* 递归定义的枚举,就是一个演示函数式编程的绝佳示例.
* swift 中的枚举,变成了一中,可以有效承载数据和算法的描述性数据结构.
* swift 中的 enumeration ,极有可能成为一种新的 Model 载体.

Classes and Structures

* 可选变量,的确会被自动初始化为 nil.
* swift 中,可以设置组件的 frame 了.呼哈哈 label.frame.origin.x = 100.
* String, Array, and Dictionary 竟然是在swift中被实现为结构体了,值传递.

Properties

* lazy 关键字实现的属性懒加载,果然比重写 getter 方法,要清晰简洁好多啊.
* 可以用 static 或 class 声明类变量/类方法; 用class 声明的类变量或类方法,支持子类重写其实现.
* [self class] 等价写法是: type(of: self).

Methods

* 结构体实例中,方法是否能够修改属性,也受实例本身的可变性的影响.
* 结构体或枚举等值类型,允许在实例方法内,直接给 self 赋值,完整替换.
* 枚举类型的相关操作,都可以封装在枚举类型自身,这样封装性会更好.

Subscripts

* subscript 是一个新的语言特性,不是简单的函数重写.
* subscript 可以接收多个参数
* subscript 的参数和返回值,可以完全自定义

Inheritance

* 可以通过 super 来使用父类方法或属性.
* 可以在方法或属性前加 final 关键字,来禁止被子类重写.
* 可以在类前加 final 关键字,来禁止被继承.

Initialization

* deisingnated init 一般只调用父类 deisingnated init; convenience init 一般只调用同类的 desingnated init;deisingnated init 中,是不允许调用同级的另一个deisingnated init;子类中,只允许调用父类的 designated init.
* 调用父类初始化方法前,子类自有的 stored property 必须先全部初始化 --> super.init 如果不显式调用, 系统会自动调用. 在调用 super.init 之前,不能调用任何实例方法,因为对象还没有效初始化.
* 用 closure 指定默认值和属性的get/set 方法的区别在于 声明有个等号(=),说明前者是个赋值操作.

Deinitialization

* 把变量置为 nil,即可触发 deinit.
* deinit 执行顺序: 子类 --> 父类.
* 不能在子类 deinit 中调用 super.deinit.

Optional Chaining

* 在访问 optional 对象的内部属性时,必须使用 ? 或 ! 进行 unwrap 操作.
* 赋值操作中,如果左侧是要赋值给 optional 实例的某个属性,则会先 unwrap optional 实例,如果不为nil,才会计算右侧的表达式.
* 链式语法中,有一个 optional 调用(X?),则返回值必然是 optional 的.

Error Handling

* 函数A中,可以 try 函数B,如果函数B抛出错误,则会直接抛给 A 的调用者.
* do-catch 中的catch 部分 和 switch-case 中的case部分,匹配方式很像.
* try? 的作用是是将函数返回值转换为 optional 对象. try? 的返回值,有可能是多层 optional,层数等于原函数返回值的 optional wrap 层数 + 1.try! 是保证不会抛出异常,如果有,就直接crash.

Type Casting

* is 近似于 isKind; 精确判断时,可以考虑使用 type(of: T1) == T2.self
* 类型转换用的是 as? 或 as!,用法习惯和 try? try! 类似.
* 数组具体化类型声明为 Any / AnyObject 时,数组内可同时存放多种类型不兼容的实例.

Nested Types

* 支持类型嵌套定义,这已经是很大的突破了.
* 即使在函数内部,也可以定义新的类型.
* 可以用.语法,访问嵌套定义的类型.

Extensions

* extensions 和 categories 的重要区别之一是,前者不需要写名字.
* extensions 不允许覆盖已有方法,且不同 extentsion 中的方法签名也不允许重复.
* extentsion 扩展的东西,是可以被子类继承的.

Protocols

* 在swift 的设定中, protocol 也属于 type,可以用于任何 type 适用的场景.
* 在类型声明遵循某协议以外的位置,书写符合协议的方法是,用 & 连接多个协议,如 AP&BP&CP.
* protocol 可以在 extension 中定义自己的方法,任意遵循此协议的类型的实例都可以调用此协议自己的方法实现. --> 可以在 extension 实现协议规定的属性或方法的默认实现. -->可以用 extension-where来指定,仅在特定条件下,才有效的protocal自有协议方法.

Generics

* 泛型类型中的占位类型,也可以用于其自身的 extention 中.
* 可以用类似 <T: SomeClass> 或 <T: SomeAProtocol&SomeBProtocol> 或 where 子句 指定占位类型本身需要满足的类型或协议约束. --> 借助 associatedtype 关键字, protocol 也可以支持泛型.
* AnyObject 本身不能直接在类型定义时,声明应遵循的协议的位置使用 --> 可以先定义一个协议 A,继承自 AnyObject,然后让类型定义时声明遵循协议 A,即可间接使用协议 AnyObject.

Automatic Reference Counting

* optional 变量,也是强引用 -> 可以继续使用 weak 关键字声明弱引用属性或变量 -> unowned 与 weak 的区别是,前者不会自动置为 nil.
* closure 是引用类型 -> closure 内引用实例属性,必须加 self前缀 -> closure 的参数声明前,可以加一个 capture list,如 [unowned self],来解决循环引用问题.
* 可以证明,在非 self 以外的情况, closure 并不会引起内部使用变量的引用计数的变化.

Memory Safety

* inout 标记的函数参数,是最容易引起访问冲突问题的.
* 往同一函数,同时以不同的 inout 参数,传递同一个实际变量,会引起访问冲突 --> 这一行为,可以被自动识别并标记出来
* 类型方法调用,不允许使用自身作为 inout 参数传递给自己的某个方法.

Access Control

* 默认访问级别是 internal,可以在定义它的模块内的各个源文件之间自由使用.
* fileprivate 和 private 并存,是因为swift中允许类型嵌套定义.
* 子类的访问级别不能比父类更宽松;但是子类可以通过重写机制,使父类的成员的访问级别变的更宽松.

Advanced Operators

* 重载操作符的语法是: static [prefix|infix|postfix] func 某个操作符 --> == 和 != 也可以重载,来简化等价判断操作.
* 复合操作符,要单独重载,不会自动根据已有操作符自动推导,如 不会根据 + ,自动实现 +=.
* 可以基于已有操作符,声明自己的操作符: prefix|infix|postfix operator 操作符,infix 二元操作符,要单独声明优先级,如 : infix operator +-: AdditionPrecedence.

【读书笔记】The Swift Programming Language (Swift 4.0.3)的更多相关文章

  1. 《The Swift Programming Language》的笔记-第24页

    The Swift Programming Language读书笔记学习笔记 第24页 本页主要内容有两个:打印输出和怎样在swift凝视代码 1 怎样打印变量和常量的值? 使用println函数,细 ...

  2. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  3. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

  4. iOS Swift-简单值(The Swift Programming Language)

    iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...

  5. The Swift Programming Language 英文原版官方文档下载

    The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...

  6. The Swift Programming Language 中文翻译版(个人翻新随时跟新)

    The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...

  7. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...

  8. The Swift Programming Language 中国版

    iSwifting社会的 Swift 兴趣交流群:303868520 iOS 微信公众账号:iOSDevTip Swift 微信公众账号:SwiftDev iSwifting社区 假设你认为这个项目不 ...

  9. 下载The Swift Programming Language.mobi版

    下载 The Swift Programming Language.mobi 下载 http://download.csdn.net/detail/swifttrain/7444501

随机推荐

  1. git之删除过滤

    把不想提交的内容删除过滤 git rm --cached **/** -f

  2. JavaScript练习笔记整理·1 - 6.23

    练习平台Codewars地址:https://www.codewars.com/ 欢迎和大家一起来讨论~╭( ・ㅂ・)و ̑̑   基础练习(1):   我的解答为: class SmallestIn ...

  3. if(!IsPostBack)

    作用: Page.IsPostBack 是用来检查目前网页是否为第一次加载,当使用者第一次浏览这个网页时Page.IsPostBack 会传回False,不是第一次浏览这个网页时就传回True:所以当 ...

  4. Data Flow ->> Excel Connection遇到错误:[Excel Source [16]] Error: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER.....

    在SSIS下做Excel导入数据的时候遇到下面的错误 [Excel Source [16]] Error: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONF ...

  5. GTID复制的搭建和问题处理

    首先看一下什么是GTID: GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号. GTID实际上是由UUID+TID组成的.其中UUID是一个M ...

  6. 【NLP汉语自然语言处理与实践】分词_笔记

    一.两种分词标准: 1. 粗粒度. 将词作为最小基本单位.比如:浙江大学. 主要用于自然语言处理的各种应用. 2. 细粒度. 不仅对词汇继续切分,也对词汇内部的语素进行切分.比如:浙江/大学. 主要用 ...

  7. svn merge error must be ancestrally related to,trunk merge branch报错

    trunk merge branch的时候报错 xxx must be ancestrally related to xxx,这个报错的意思是两者不关联,所以需要去建立关联. [回顾背景]       ...

  8. June 20th 2017 Week 25th Tuesday

    Care and diligence bring luck. 谨慎和勤奋,带来好运气. In my opinion, care and diligence may just gurantee us a ...

  9. Hive入门操作

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.本文描述了HIve的一些基本操作,如有错误之处还请指出. 常用语法 #显示相关信息 sh ...

  10. [原]零基础学习在Android进行SDL开发后记

    本着学习交流记录的目的编写了这个系列文章,主要用来记录如何从零开始学习SDL开发的过程,在这个过程中遇到了很多问题,差点就放弃了.首先是SDL的Android移植的时候遇到了比较坑的是SDL移植到An ...