Swift变量、常量和属性
[Swift类型]
variable
- 命名存储地址的存储单元。每个变量都有一个类型,该类型定义了内存大小、属性和行为。
Swift变量和常量
constant
是一个 variable
,但是在定义之后不能被修改。
//definition
var <name> = <initial_value>
//type annotation
var <name>: <Swift_type> [= <initial_value>] // [] is optional
//var - variable
var myVariable1 = 11
var myVariable2: Int
myVariable2 = 12
//let - constant
let myConstant1 = 21
let myConstant2: Int
myConstant2 = 22
全局变量和局部变量
全局变量是在函数、类外定义的变量。
局部变量是指在类型上下文(类、结构体、枚举)、函数或函数参数内定义的变量。[关于]
属性
属性
- 将值与类型上下文关联起来。 它由变量和绑定的getter/setter
组成。 它具有字段语法,但在底层使用方法(getter/setter)。
存储属性和计算属性
它们可以属于实例(实例属性
)或类型(类型属性
):
存储属性
(class, structure)
计算属性
(class, structure, enum)
存储属性
是一种局部变量
->类型上下文内的变量。 Swift存储属性不支持像Objective-C那样的 实例变量
。
- 变量存储属性 -
var
- 常量存储属性 -
let
它支持属性观察器
(willSet
, didSet
)
计算属性
- 提供getter
和可选的setter
以每次计算一个值。
public class Person {
var firstName = "John"
var lastName = "Wick"
var fullNameComputedProperty: String {
get {
return "\(firstName) \(lastName)"
}
set {
let arr = newValue.split(separator: " ")
firstName = String(arr[0])
lastName = String(arr[1])
}
}
var addressStoredProperty: String {
willSet {
print("old address:\(addressStoredProperty)")
print("new address:\(newValue)")
}
didSet {
print("old address:\(oldValue)")
print("new address:\(addressStoredProperty)")
}
}
}
惰性存储属性
当第一次访问到它时计算属性的值(按需计算)
- 只能使用
var lazy
,因为let
需要在初始化时确定一个值。
使用closure初始化/定制存储属性
官方文档
你可以通过帮助closure
来初始化/设置/定制存储属性。
- 在闭包末尾加上
()
会立即执行闭包并将值分配给存储属性(计算并返回一个值)。
- 在初始化情况下,无法访问任何实例变量或函数,因为它还没有初始化。
- 在初始化情况下,它将为每个对象仅执行一次,如果使用静态,则为类执行一次。[示例]
示例
func testStoredPropertyWithClosure() {
class ClassA { }
class ClassB {
static let staticStoredProperty: ClassA = {
print("init staticStoredProperty")
return ClassA()
}()
var storedProperty: ClassA = {
print("init storedProperty")
return ClassA()
}()
func foo () {
storedProperty = {
print("customize storedProperty")
return ClassA()
}()
}
}
let b = ClassB()
b.foo()
ClassB.staticStoredProperty
}
闭包存储属性
vs 计算属性
闭包存储属性
只被调用一次,并且在初始化后可以更改(如果是var
)
计算属性
每次被调用时都会重新计算
[Java变量、属性...]