class的属性和方法

一、属性

1、存储属性

存储属性就是存储特定类的一个常量或者变量

//这里的name,age就是存储属性
struct Person{
    let name:String
    var age:Int
}

2、懒存储属性

懒存储属性是指第一次调用的时候才会计算其初始值的属性,通过lazy来标识

class Person{
    //假如这个类初始化的时候是耗时操作
}

class PersonInfo{
    //懒加载的话不用初始化p属性的时候就穿件Person实例,可以等到用的时候再加载,
    //而且p并不是一定要用,这样即可以节省时间,又可以节省内存
    lazy var p = Person()
}

注意:必须将懒存储属性声明成变量,因为属性的值在实例构造完成之前可能无法得到,而常量属性在构造过程完成之前必须要有初始值,因此懒存储属性必须声明为变量。

3、计算属性

计算属性不存储值,而是提供了一个getter和setter来分别进行获取值和设置其他属性的值。getter、setter分别使用get、set关键字进行定义。

class Person{
    //age是存储属性
    var age:Int = 18
    //height是计算属性
    var height:Int
    {
        get{
            return 3;
        }
        set{
            age = newValue/2;
        }
    }
    //只读计算属性
    var height1:Int
    {
        get{
            return 3;
        }
    }
    //只读属性可以省略get
    var height2:Int
    {
        return 3;
    }
}
4、属性观察器

详见swift下标脚本语法、willSet、didSet方法

5、类型属性

类型属性用关键字static标识,可用class代替static关键字。类型属性属于类用(类名.属性)方式调用

class Person{
    static var age:Int = 18
}
print(Person.age)

二、方法

实例方法由对象调用,类型方法由类调用

1、实例方法
class Person{
    //无参无返回值
    func info(){
        print("hahaha")
    }
    //有参无返回值
    func info1(age:Int,name:String){
        print(age)
    }
    //无参有返回值
    func info2() -> String {
        return "我是返回值";
    }
    //有参有返回值
    func info3(name:String) -> String{
        return name;
    }
}

let p = Person()
p.info()
p.info1(age: 1, name: "我是名字")
print(p.info2())
print(p.info3(name: "我是info3"))

控制台输出值:

hahaha
1
我是返回值
我是info3
2、类型方法

类方法由类调用,仅此而已

class PersonInfo{
    static func sayHello(){
        print("hello")
    }
}
PersonInfo.sayHello()

控制台输出值:

hello

三、构造函数

构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象的属性设置初始值

Tips:Swift中类实例化之后,所有的存储型属性必须有值。

1、构造函数基础

创建类之后必定要实例化对象,现在有两种方法设置初始值。

//方法一:定义属性时赋初始值
class Person{
    var name:String = "我是张三"
    var age:Int = 16
}
var p = Person()
print(p.name)
//方法二:将属性值设置为Optional
class Person{
    var name:String?
    var age:Int?
}
var p = Person()
p.name = "name"
print(p.name!)

观察之后不难发现这两种方法设置初始值费时费力。由此引出构造函数

import UIKit
class Teacher : NSObject{
    var name:String
    
    //重写构造函数
    override init(){
        name = "dadada"
        super.init()
    }
}
var t = Teacher()
//t.name = "大老师"
print(t.name)
2、重载构造函数

重写:子类继承父类,重写父类的方法
重载:当前类中方法名相同,参数列表不同

class Student : NSObject{
    var name:String
    var age:Int
    //如果重载了构造函数,系统默认提供的构造函数就不能再被访问
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
}
var s = Student(name:"zhng",age:14)
print(s.name)
3、指定构造函数与便利构造函数
//指定构造函数 是类中最主要的构造函数。一个指定构造函数将初始化类中提供的所有属性,并根据继承链往上调用父类的构造函数来实现父类的初始化
//便利构造函数是类中比较次要的、辅助型的构造函数。。可以定义便利构造函数来调用同一个类中的指定构造函数,并为其参数提供默认值。
//便利构造函数有以下几个特点
//1、只有便利构造函数中可以调用self.init()
//2、便利构造函数不能被重写或者使用super调用父类的构造函数
//3、不能被继承
class Per : NSObject{
    var name : String
    init(name:String) {
        self.name = name;
        super.init()
    }
    convenience override init() {
        self.init(name:"哈哈哈");
    }
    deinit {
        print("Per被销毁了")
    }
}

四、析构函数

在一个类的实例被释放之前,析构函数会被调用。deinit无参 无返回值。

class Per : NSObject{
    var name : String
    init(name:String) {
        self.name = name;
        super.init()
    }
    convenience override init() {
        self.init(name:"哈哈哈");
    }
    deinit {
        print("Per被销毁了")
    }
}
var pp:Per? = Per()
print(pp!.name)
pp = nil

控制台返回如下:

哈哈哈
Per被销毁了

你可能感兴趣的:(class的属性和方法)