Swift基础之08-类和对象

import UIKit

一,类的属性定义

  • 1,类的创建(如果不想继承NSObject可以直接把: NSObject去掉)

  • 在对对象内部的属性进行初始化赋值的时候:

  • 一般值类型,像字符串,基本数据类型Int等,直接初始化为空值,“”或者0等

  • 如果是对象类型UIView则初始化为nil,即可选类型

class cat: NSObject{
    var name:String = ""{
        willSet{
            print("即将改变")
        }
        didSet{
            print("已经改变")
        }
    }
    var age:Int = 0
    
    //重写这个方法是为了避免赋值给没有的属性时候报错的情况,但是我这里还不知道内部怎么重写
    override func setValue(_ value: Any?, forKey key: String) {
        
    }
}

let p = cat()
p.name = "zhang"
p.name
p.setValuesForKeys(["name":"jack", "age":10, "num":100])
p.name
p.age

let view = UIView()
  • 2,类的属性定义(存储属性,计算属性,类属性)
class dog: NSObject{
    
    //普通存储属性的定义
    var name:String?//可选类型默认是nil,可以这么复制,但是一般对于值类型复制为空,swift中字符串不是对象类型哦
    var keyNum:String = ""//这里是赋值空字符串
    var age:Int = 0
    var score01:Int = 0
    var score02:Int = 0
    
    //取平均值方法一:函数
    func average() -> Int {
        return (score01 + score02)/2
    }
    //取平均值方法二:计算属性的定义:把上述的函数直接写成属性->只读属性///用的不多
    var average01:Int{
        return (score01 + score02)/2
    }
    
    //类属性的定义:(所有的对象都有的属性,static修饰)///用的不多
    static var tail:Bool = true
    
}

let d = dog()
d.name = "zhang"
d.keyNum = "123456"
d.age = 20
d.score01 = 40
d.score02 = 80

print(d.name, d.keyNum, d.age)

//如果用的是可选类型,需要进行解包,那么就需要用可选绑定进行操作更好
if let name = d.name{
    print(name)
}

//可以直接用函数对属性进行某些操作
d.average()

//但一般情况下用计算属性,如下
d.average01

二,构造函数

(如果自己实现了构造函数,会覆盖原有的构造函数,如果不想要覆盖,需要手动的写出原来的构造函数)

class Person:NSObject{
    var name:String = ""
    var age:Int = 0
    var hobby:String?
    
    //这里是为了保留原有的构造函数方法
    override init() {
        //在构造函数中如果没有调用父类方法, 系统也会自动调用
        super.init()
    }
    
    init(name:String, age:Int) {
        //加self是为了避免歧义,不然name会就近选择选择init中参数name
        self.name = name
        self.age = age
    }
    
    init(dict:[String:AnyObject]){
        // //as?转成可选类型,as!转成固定类型
        // name = dict["name"] as! String
        // hobby = dict["hobby"] as! String?
        // age = dict["age"] as! Int
        
        // let opName = dict["name"] as? String//首先要解包成可选类型(不要强制解包成直接类型)
        
        //用可选绑定进行赋值
        // if let name = dict["name"] as? String {
        // self.name = name
        // }
        
        super.init()
        self.setValuesForKeys(dict)
    }
    
    //重写这个方法处理字典中没有对应的那些键值
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
}

let person = Person(name: "zhang", age: 10)
person.age
person.name

let person01 = Person(dict: ["age":50 as AnyObject, "name":"zhang" as AnyObject])

person01.name
person01.age

三,类的属性监听

class Student:NSObject{
    
    var name : String? {
        //属性监听器的两个方法
        willSet{
            print("willset")
        }
        didSet{
            print("didset")
        }
    }
    
    var age:Int? = 0{
        willSet{
            print(newValue)
        }
        didSet{
            print(oldValue)
        }
    }
}

let stu = Student()
stu.name = "zhang"
stu.age = 10

stu.age = 230

你可能感兴趣的:(Swift基础之08-类和对象)