一、属性
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被销毁了