iOS开发之Swift标识符
在iOS开发中,使用Swift语言时,标识符是用来命名变量、常量、函数、类、结构体、枚举等程序实体的;
这些标识符使得Swift代码更加清晰、易于理解和维护。
一、变量与常量:var、let
var
代表variable,即变量。
当使用var
声明一个变量时,Swift
会尝试根据初始值推断变量的类型,如果初始值提供了足够的信息来确定类型,那么编译器会自动为变量分配一个类型,否则需要显式指定变量的类型;
一旦变量的类型被确定,Swift
会在内存中根据变量的类型为该变量分配足够的空间来存储其值;
变量的值可以在其生命周期内的任何时刻被改变。
let
代表let constant,即常量。
当使用let
用于声明一个常量,这意味着该常量的值在初始化后不能被改变。
与var
相同,当使用let
声明一个常量时,Swift
会尝试根据初始值推断常量的类型并根据类型分配足够的空间将初始值存储。
Swift
使用ARC
来管理内存,无论是常量还是变量,当它们不再引用时,Swift
会自动释放内存。
对比
Objective-C
,这种声明方式的代码可读性更高,可以明确哪些值可变哪些不应该改变;
这种方式可以避免常量被意外修改;
编译器会在运行时系统进行优化,例如将常量的值嵌入到代码中,而不是每次使用都查找其值;
Swift
符合函数式编程思想,强调不可变性,尽量避免在程序执行过程中改变状态。
二、访问控制与级别:open、public、internal、fileprivate、private
Swift
提供访问控制机制,允许指定类、属性、方法等成员的可见性。
open
允许在模块内外被访问使用,也可以在子类中被重写;
public
允许在模块内外被访问使用,但不能被外部子类中重写可以在内部子类中重写;
internal
只允许在定义它的模块内部被访问使用,为默认级别;
fileprivate
只允许在其被定义的源文件内部被访问使用;
private
只允许其在被定义的封闭作用域内被访问使用。
通过合理利用访问级别控制成员的可见性和可访问性,有利于封装内部细节,只暴露必要的接口给外部使用,从而保护封装性和安全性。
三、数据类型与关系的定义:class、struct、enum、protocol、extension
class
是面向对象程序设计中的概念,是面向对象编程的基础;
是一种复杂的数据类型,包含数据成员和成员函数,数据成员对应属性,成员函数用于操作各种属性;
引用类型,可继承其他类和拥有子类。
struct
是值类型数据结构,使单一变量可以存储各种数据类型的相关数据;
与class
相似,都拥有属性、方法,并能遵守协议和实现拓展;
无法继承,当给变量赋值时,会将对象复制一份给变量。
enum
定义一组可能的值列表的自定义类型模型;
值可以是自定义的特定数据,也可以是一组有共同特性的数据的集合;
值可以是任何整数、符点类型的值,也可以是字符串或字符。
protocol
用于定义方法、属性和下标的声明,可以被枚举、结构体、类遵守;
定义的方法在遵守协议的类、结构体、枚举中必须实现;
属性必须使用var
定义。
extension
是Swift
的一个重要特性,可以为已存在的枚举、结构体、类别和协议添加新功能,而不需要修改该类型原本定义的代码;
可以新增计算属性、定义实例方法和类型方法、提供新的构造器、定义下标、定义和使用新的嵌套类型,甚至让一个已存在的类型遵守某个协议。
class
、struct
、enum
是Swift
中的数据类型,用于定义和描述数据的结构和行为。
protocol
用于定义一组行为规范,可以由其他类型遵守。
extension
用于为已存在的类型添加新功能。
Swift
的写时复制(Copy-on-write
)技术是一种高效的内存管理技术,其核心思想在于,在多个对象或调用者尝试访问和修改相同资源时,只有当某个对象或调用者尝试修改资源内容时,才会真正复制一份私有副本给该对象或调用者。
四、操作符与运算:infix、prefix、postfix和operator
infix
为中间操作符,默认操作符,定义出现在两个操作数之间的操作符,在自定义时需要指定优先级和结合性;
prefix
为前置操作符,通常用于表示对单个操作数的某种转换或操作;
postfix
为后置操作符,通常用于表示对单个操作数的某种后续操作或转换;
在声明自定义操作符时,需要使用operator
配合并指定结合性(associativity
)和优先级(precedence
)。
五、函数参数类型修饰:inout
inout
用于指定函数参数应该通过引用传递而不是值传递;
使用inout
修饰的函数参数在函数内部修改时会直接影响外部的原始变量。
调用函数时需要使用&操作符来引用变量;
参数必须要使用var修饰;
inout参数不能有默认值。
六、类型转换:as
Swift
是一种静态语言,在编译时编译器需要知道每个变量、常量、函数参数和返回值的类型,as
用于显式进行类型转换,告诉编译器希望将一个值视为另一种类型。
在向上转型的过程中,as
确保编译器接受转换,因为从逻辑上讲任何派生类的实例也都是其基类的实例;
在向下转型的过程中,这是从基类转换到派生类的过程,这种转换是不安全的;
使用as?
时会返回一个可选值(Optional
),如果成功则可选值包含转换后的结果,如果转换失败则可选值为nil
;
使用as!
用于强制转换,编译器会假设转换一定会成功,如果不成功会在运行时崩溃。
Optional
为枚举类型public enum Optional<Wrapped>: ExpressibleByNilLiteral
,有两个case
,none
和some(Wrapped)
。
七、无主引用:unowned
在Swift
中unowned
(weak reference
)为弱引用的替代方案,用于解决循环引用问题;
unowned
假定引用的对象始终存在,并且不会变成nil
,相对Objective-C
中的weak
而言引用更快,不需要在运行时检查引用是否有效,但是若引用的对象被提起释放则尝试访问该对象会导致运行时错误。