"Reading notes" the Swift programming Language (Swift 4.0.3)

Source: Internet
Author: User
Tags switch case type casting

Material: Language Guide

First contact with Swift, it is recommended to look at A Swift Tour, otherwise the thought conversion will be very laborious, easy to die or dead.

The same is true for each chapter that summarizes only 3 of the points that you think are most important. That's good! Force you to think and choose. Later, it is also convenient to quickly reconstruct memory.

Note: Personal notes are for informational purposes only and are not guaranteed to be accurate in strict sense.

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.

"Reading notes" the Swift programming Language (Swift 4.0.3)

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.