Swift 杂记 持续更新中

2019-09-25  本文已影响0人  烟雨痕
map 和 flatMap: 对元素进行变换
filter: 元素是否应该被包含再结果中
reduce: 如何将元素合并到一个总和的值中
sequence:序列中下一个元素应该是什么
forEach:对于一个元素,应该执行怎样的操作
sort、lexicographicCompare、partition:两个元素应该以怎样的顺序进行排列
elementsEqual 和 starts: 两个元素是否相等
split: 这个元素是否是一个分割符
prefix: 当判断为真的时候,将元素过滤出到结果中,一旦不为真,将剩余的元素抛弃,和filter类似,
但是会提前退出,这个函数在处理无限序列或者延迟计算的序列时会非常有用。
drop: 当判断为真的时候,丢弃元素。一旦不为真,返回将其余的元素。和prefix(while:)类似,
不过返回相反的集合。
Hashable 要求

1.字典其实是哈希表,字典通过键的hashValue来为每个键再其底层作为存储的数组上指定一个位置。
2.为了保证让你更性能,哈希表要求存在在其中的类型提供了一个良好的哈希函数,这个函数不会产生太多的冲突。
3.对于结构体和枚举,只要它们是由可哈希的类型组成,那么Swift就可以帮助我们自动合成Hashable协议所需要的实现。
4.不同的哈希值的数量是有限的,然而很多可以被哈希的类型(比如字符串)的个数是无穷的。
5.标准库的通用哈希函数使用一个随机种子作为其输入之一,也就是说,字符串"abc"的哈希值在每次程序执行时都会是不同的。
6.设置环境变量SWIFT_DETERMINISTIC_HASHING=1来禁用随机种子,但是你不应该在正式环境中这么做。
Set

Set是通过哈希表实现的,并拥有类似的性能特性和要求,一组无序的元素,每个元素只会出现一次。
IndexSet

IndexSet表示一个由正整数组成的集合。比Set<Int>更加高效, 因为它内部使用了一个组范围列表进行实现。tableView有100行,在选取10行的情况下,IndexSet里其实只存储了选择的首位和末位两个整数值。
可选值并不是什么魔法,它就是一个普通的枚举值。

可选值是值类型,解包一个可选值做的事情是将它里面的值复制出来。

使用?作为在switch中对some进行匹配时的模式后缀,另外,可以使用nil字面量来匹配none:

var array = ["one", "tow"]
// 第一种
switch array.firstIndex(of: "three") {
    case .some(let idx):
            array.remove(at:idx)
    case .none:
              break 
}
// 第二种
switch array.firstIndex(of: "three") {
      case let idx?:
                array.remove(at: idx)  
      case nil:
                break;
}

请注意a = 10, 和 a? = 10的细微不同,前一种写法无条件地将一个新值赋给变量,而后一种写法只在a的值在赋值发生前不是nil的时候才会生效。

当你的model类型是struct类型时,当你model某个属性未nil赋值时,不会生效的。
while let 语句 表示当一个条件返回nil时便终止循环。

Void 是空元组的另一种写法

publIc typealias Void = ()

nil 是小于0的。

函数

1.函数可以像Int或者String那样被赋值给变量,也可以作为另一个函数的输入参数,或者另一个函数的返回值来使用。
2.函数能够捕获存在于其局部作用域之外d 变量。
3.有两种方法可以创建函数,一种是使用func关键字,另一种是{}。 在Siwft中,后一种被称为闭包表达式。
4.全局函数赋值给变量时,需要先决定它的参数类型,变量不能持有泛型函数,它只能持有一个类型具体话之后的版本。
5.闭包指的是一个函数以及它所捕获的所有变量的组合。而使用{}来创建的函数被称为闭包表达式,常常把这种语法简单地叫做闭包。但是不要因此就认为使用闭包表达式语法声明的函数和其他方法声明的函数有什么不同。它们都是一样的,它们都是函数,也都可以是闭包。
let

声明变量的地方看到let修饰,声明的东西是不是完全不可变,需要先知道这个变量持有的值类型还是引用类型。

写时复制(copy-on-write)

Data结构体发生变化的时候对其中的NSData对象进行深复制,使用的就是写时复制,这种特性并不是直接具有的,它需要额外进行实现。

try、try?、 try!

try:手动捕捉异常
try?: 系统处理,出现异常返回nil, 没有异常返回对应的对象。
try!: 强制执行,出现异常程序会crash。

?和 !

在声明变量时,使用?符号则表示变量声明为可选类型
在声明变量时,使用!符号则表示变量声明为隐式解析的可选类型, 不用强制解包。
在取变量的值时使用!符号则表示要进行强制拆包
在取变量的值时使用?符号则表示要进行可选链调用。

-- 待更新
上一篇下一篇

猜你喜欢

热点阅读