swift中的动态派发和静态派发
值类型满足静态派发
动态派发
- 方法调用
值类型和引用类型
值类型:
Array
String
Dictionary
引用类型
区别
- 值类型在栈上操作,引用类型在堆上操作
mutating关键字
- 默认情况下,不能在实例方法中修改值类型的属性.若在实例方法中使用 mutating 关键字,不仅可以在实例方法中修改值类型的属性,而且会在方法实现结束时将其写回到原始结构.
final关键字
- final 声明的类不能被继承,final 声明的属性、方法和下标不能被重写。
Optional
Optinal 类型来表示各种类型的无值状态,并规定了nil不能用于非可选的常量和变量,只能用于Optinal类型
解决方案
强行打开-不安全let a: String = x!
隐式解包变量声明 - 在许多情况下不安全 var a = x!
可选绑定 - 安全 if let a = x { xxxx }
可选链接 - 安全 let a = x?.count
无合并操作员 - 安全 let a = x ?? “”
警卫声明 - 安全 guard let a = x else { return}
可选模式 - 安全 if case let a? = x { }
inout
- inout 输入输出参数,让输入参数可变类似__block 的作用
typealias
- typealias 不是一个泛型类型,它只是一个占位符的名字。它通常是作为关联类型被引用,只有协议被一个类型引用的时候它才被定义。
Error
- Error是一个协议, swift中的Error 都是enum, 可以转 NSError.如果需要Error有NSError的功能,实现 LocalizedError CustomNSError 协议.
权限修饰符
权限顺序:open > public > interal > fileprivate > private
open :修饰的属性或者方法在其他作用域既可以被访问也可以被继承或重载 override。
public :修饰的属性或者方法可以在其他作用域被访问,但不能在重载 override 中被访问,也不能在继承方法中的 Extension 中被访问。
internal(默认):被修饰的属性和方法只能在模块内部可以访问,超出模块内部就不可被访问了。
fileprivate :其修饰的属性或者方法只能在当前的 Swift 源文件里可以访问。
private :只允许在当前类中调用,不包括 Extension ,用 private 修饰的方法不可以被代码域之外的地方访问。
struct与class的区别
struct是值类型,class是引用类型
值类型的变量直接包含它们的数据,对于值类型都有它们自己的数据副本,因此对一个变量操作不可能影响另一个变量.
值类型包括结构体 (数组和字典),枚举,基本数据类型 (boolean, integer, float等).
引用类型的变量存储对他们的数据引用,对一个变量操作可能影响另一个变量.
struct是深拷贝;class是浅拷贝
property的初始化不同
class 在初始化时不能直接把 property 放在默认的 constructor 的参数里,而是需要自己创建一个带参数的 constructor;
而struct可以,把属性放在默认的 constructor 的参数里
immutable变量
可变内容和不可变内容用var和let来甄别,如果初始为let的变量再去修改会发生编译错误。struct遵循这一特性;class不存在这样的问题
struct 和 class 的差別是 struct 的 function 要去改变 property 的值的时候要加上 mutating,而 class 不用
struct不可以继承,class可以继承。
struct分配在栈中,class分配在堆中。
closure
与Block的区别
closure是匿名函数、block是一个结构体对象
closure通过逃逸闭包来在内部修改变量,block 通过 __block 修饰符
associatedtype
- 关联类型:为协议中的某个类型提供了一个别名,其代表的真实类型在实现者中定义.
map、fliter、reduce
subscript
- 自定义下标获取
where语句