Swift 学习笔记(五)
2019-01-25
//回来恶补基础知识…
-
结构体 结构体中的赋值就是默认值 能够修改值的变量用
var
声明 常量用let
声明struct A { var var_1: Int let let_1: Int } //结构体成员必须初始化 var mystruct:A = A(var_1: 123, let_1: 321) //注意不能写成A(let_1 321, var_1: 123) //因为编译器会自动生成一个init(var_1:Int, let_1:Int)的构造函数 //所以也可以写成A.init(var_1: 123, let_1: 321)
struct A { var var_1: Int = 1000 let let_1: Int = 2000 } var my2:A = A() //已有默认值可以不用初始化结构体成员 var my3:A = A(var_1: 123) //可以修改变量(var)的值 //var my4:A = A(let_1: 321)//不可修改常量(let)的值
-
类 Swift 的类由编译器自动生成对外接口
class A { var var_1:Int let let_1:Int init(var_1: Int, let_1: Int) { self.let_1 = let_1 self.var_1 = var_1 print("hello") } } var my1:A = A.init(var_1: 123, let_1: 321) //hello print("\(my1.let_1) and \(my1.var_1)") //321 and 123
这里定义了一个init//相当于构造函数 否则就要这样写
class A { var var_1:Int = 0 let let_1:Int = 0 }
这时候编译器会自动生成一个没有参数的init Swift 中的成员函数
class A { func func_1() -> String { print("func_1") return "return func_1" } } var my1:A = A() print("\(my1.func_1())") //func_1 //return func_1
总结一下
Swift 中编译器会自动给结构体和类生成默认的构造函数
实际上Swift 为了安全, 要求在变量声明时初始化变量
否则就要用可选类型, 如 var x:Int?
用===
或!==
判断两个变量常量是不是同一个类实例//理解为是否指向同一处地址
Swift 属性将值跟特定的类、结构或枚举关联。
-
存储属性 一般保存在结构体、类中的常量、变量值
-
延迟存储属性 当第一次调用的时候才计算初始值的属性
class aClass { var s = "helloworld" } class hardClass { var s = aClass() } class lazyClass { lazy var s = aClass() } var LClass = lazyClass() var HClass = hardClass() print(LClass.s.s) print(HClass.s.s)
调试可见
HClass
声明后将所有值都初始化完成LClass
会在调用前(被print)把s
先初始化为nil
, print前完成所有初始化 -
计算属性 不直接存储值,提供一个get来获取值(相当于一个取值的函数)一个set来设置值
class Cube { var a = 10.0, b = 10.0, c = 10.0 var heartIs: (Double, Double, Double) { get { return (a/2, b/2, c/2) } set { a = newValue.0 * 2 b = newValue.1 * 2 c = newValue.2 * 2 } } } var aCube = Cube() print(aCube.heartIs) aCube.heartIs = (100, 100, 100) print(aCube.a) print(aCube.b) print(aCube.c)
set也可指定参数名:
set(varName)
默认参数名为newValue -
只读计算属性 不能设置新的值的属性
class Sphere { var r = 10.0 var V: Double { return 3.14*r*r*r } } var S = Sphere() print(S.V)
-
属性观察器 对于每个属性都可以设置
willSet
(值修改前调用),didSet
(值修改后调用)