Swift中的属性修饰符(复习)
2018-05-21 本文已影响12人
小驴拉磨
在Swift中没有.h、.m,只有一个.swift文件。而且在Swift中声明属性也大不相同。这个需要我们先了解Swift中常量和变量的声明。
Swift中的常量和变量
常量的值一旦设定就不能改变,而变量的值可以在之后进行赋值修改。
- 声明常量和变量
常量和变量必须在使用前声明,Swift中用 let 来声明常量,用 var 来声明变量。
例如:
let studentId = 201012344 // 声明一个名字是studentId的常量,并给他一个值201012344。
var age = 20 // 声明一个名字是age的变量,并给他一个值20。
//你可以在一行中声明多个常量或者多个变量,用逗号隔开:
var x = 0.0, y = 0.0, z = 0.0
注意:
如果你的代码中有不需要改变的值,请使用 let 关键字将它声明为常量。如果需要改变,只将需要改变的值声明为变量。
- 类型标注
当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
例如我们声明一个字符串变量sendMessage
//下面的代码可以说:“声明一个类型为 String ,名字为 welcomeMessage 的变量。”
var welcomeMessage: String
//你可以在一行中定义多个同样类型的变量,用逗号分割,并在最后一个变量名之后添加类型标注:
var red, green, blue: Double
注意:
一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型。
Swift中的内存管理
Swift 也是使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内存管理机制会一直起作用,开发者无须自己来考虑内存的管理。ARC 会在类的实例不再被使用时,自动释放其占用的内存。
注意:
引用计数仅仅应用于类的实例。结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递。
Swift 访问修饰符
- private:修饰的属性或者方法只能在当前类里面访问。
- fileprivate:fileprivate所修饰的属性或者方法在当前的Swift源文件里可以访问。
- internal:internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。 如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。 如果是App代码,也是整个App代码,也是在整个App内部都可以访问。(默认访问级别,internal修饰符可写可不写)
- public :可以被任何人访问,但是在其他module中不可以被重写和继承,而在本module中可以重写和继承
- open :可以任何人使用,包括重写和继承。
5种修饰符访问权限排序
open > public > internal > fileprivate > private
声明只读属性
//声明一个String类型,名字为helloWord的可读可写属性。
var helloWord: String
//声明一个String类型,名字为helloWord的外部只读属性,内部可读可写。
private(set) var helloWord: String
Swift中strong,weak,unowned关键字
- strong:在Swift中声明一个属性时,默认就是强引用。
//默认就是strong,变量
var person = Person()
//默认就是strong,常量不可变
let person = Person()
- weak:弱引用对象的引用计数不会+1, 必须为可选类型变量。
在声明弱引用对象是必须用var关键字, 不能用let,因为弱引用变量在没有被强引用的条件下会变为nil, 而let常量在运行的时候不能被改变.
class Test {
//会报错
weak let tentacle = Tentacle() //let is a constant! All weak variables MUST be mutable.
}
- unowned:相当于__unsafe_unretained, 不安全. 必须为非可选类型。
unowned引用是non-zeroing(非零的), 在ARC销毁内存后,不会被赋为nil, 这表示着当一个对象被销毁时, 它指引的对象不会清零. 也就是说使用unowned引用在某些情况下可能导致dangling pointers(野指针). 所以在访问无主引用的时候,要确保其引用正确,不然会引起内存崩溃。 - 隐式解析可选类型 :语法是在变量后面加上感叹号(例如var name:String!). 在初始的时候可以为nil, 但是第一次赋值以后便会一直有值. 使用该类型只需要正常调用, 不需要像可选类型那样解包.
注意:
如果两个对象相互强引用也会造成循环引用,与OC类似;