属性
- 属性将与指定类,结构体,枚举相关联。
存储属性: 将常量和变量存储为实例的一部分。有类,结构体提供。
计算属性: 计算值,由类,结构体,枚举提供。
属性观察:定义属性观察器来监视属性的修改,从而进行自定义的操作进行响应。
存储属性
struct Person {
//以下为变量(var)和常量(let)的存储属性
var name: String
let sex: String
let age: Int
}
var people = Person(name: "Bill", sex: "男", age: 20) //这个people我们使用var声明的变量,所以他可以修改他的名字
people.name = "Jack"
people.age = 21 //将会出错,因为它是常量(let)初始化之后就不能在被改变了
- 恒定结构体实例
let people = Person(name: "Bill", sex: "男", age: 20)
people.name = "jason" //会出错
- 由于结构体是一个值类型,当改值类型被标记为常量时(let),其所有属性也被标记为常量。对类是不同的,他们是引用类型,入伏哦将引用类型的实例分配给常量,则人仍可以改变实例的变量属性。
懒加载
- 一个lazy的存储属性,它的初始化值第一次调用时不会被计算。您lazy在声明之前编写修饰符,表示一个懒惰的存储属性。
懒惰属性必须是变量(var),因为实例初始化完成后,无法知道它的初始值,当时常量必须在对象初始化时必须有一个初始值。因此常量属性不能被声明为lazy的。
class Person: NSObject {
var name: String
lazy var tags = ["ios","Web", "Java", "Pyth"] //加入这是一个有很多数量的数组
init(name: String) {
self.name = name
}
}
let people = Person(name: "Bill")
- 这个时候tags并不会被创建,只有第一次调用才会会创建。
计算属性
- 错误写法
class Person: NSObject {
var name: String {
get {
return self.name //这样会造成递归调用,最终造成程序崩溃
}
set(newName) {
newName.appending("Bill")
}
}
}
- 正确的姿势
class Person: NSObject {
private var _name: String!
var name: String {
get {
return self._name //这样会造成递归调用,最终造成程序崩溃
}
set(newName) {
self._name = newName.appending("Bill")
}
}
}
属性监测
class Person: NSObject {
var name: String = "" {
didSet {
print("已经起好名字了")
}
}
}
只读属性
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double { //只读
return width * height * depth
}
}
- 另外一种设置方法就是使用let,但是这种方法不太灵活
静态属性 Static
-
使用static声明的属性,使用改类调用,该属性存储在静态区。
-
我们可以使用这个Static创建一个单例
class Person: NSObject {
static let sharedInstance = Person()
private override init() {
//防止外界使用init实例化
}
}
补充
-
初始化Swift常量
-
假如现在我们想声明一个label, 我们一般会这样做。
func createLabel() -> UILabel {
let label = UILabel()
label.text = "Bill"
return label
}
- 当然我们也可以通过闭包去初始化
let label: UILabel = {
let label = UILabel()
label.text = "Bill"
return label
}()
- 当然我们还可以使用传入参数的闭包
let label: UILabel = {
$0.text = "Bill"
$0.font = UIFont.systemFont(ofSize: 15)
return $0
}(UILabel())
print(label.text!) // Bill
网友评论