swift5.0(三)类 构造、属性、监听

下面展示一些 内联代码片


//类的定义  面向对象的基础是类  类产生了对象

class Person : NSObject { //用到kvc 需要继承object
    @objc  //使用@objc修饰将暴露给Objective-C的类、方法、属性等
    var age : Int = 0;
    //重写 override  如果写的某一个方法是对父类的方法重写,必须加override
    override func setValue(_ value: Any?, forUndefinedKey key: String) {

    } //设置没有的属性
}
let p = Person()
p.age = 20;
p.setValuesForKeys(["age":"11", "name":"ace"])
p.setValue(12, forKey: "age")
print(p.age)   //12

class Student : Person{
    var name = ""
    
}
let  s = Student()
s.age = 10
s.name = "2"

class People : NSObject{
    //1.存储属性
    var age:Int = 0
    var name:String? //name 是空 可选类型
    var mathScore:Double = 0.00
    var chineseScore = 0.00
    
    //2.定义计算属性  通过其他方式计算结果
    var totalScore:Double {
        return mathScore + chineseScore
    }
    /*//定义方法  返回总分 不推荐
    func sumScore() -> Double { //使用当前对象的某个属性或方法 直接使用
        return mathScore + chineseScore
    }*/
    
    
    //3.类属性 和整个类相关的属性,并且是通过类名进行访问
    static var couresCount:Int = 0
}

let peo = People()
peo.age = 10
peo.name = "a"
peo.mathScore = 58.9
peo.chineseScore = 89
print(peo.age) //有初始值  和之前的可选类型作对比
if let name = peo.name {
    print(name)
}

let averageScore = (peo.mathScore + peo.chineseScore) * 0.5 //平均分   乘法效率高于除法
print(peo.totalScore)

People.couresCount = 3

//


//类的构造函数  系统默认的构造函数 类后面的 ()
class Person:NSObject {
    @objc var name = "" //oc的kvc  别忘记@objc
    @objc var age = 0
    override init() { //继承Object 父类有init 重写需要加上override
        //构造函数 没有super.init()  系统默认调用 写不写都可以
        //super.init()
        print("--")
    }
    //自定义构造函数
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    init(dict: [String : Any]) {
        //此时tempName是可选类型AnyObject? 转成String?
        //as?最终转成的类型是一个可选类型
        let tempName = dict["name"]
        let tempAge = dict["age"]
        
        name = tempName as! String  //如果上面的name是可选类型  var name : string 那么 name = tempName as? String  此处的name已经是String 所以把Any转成String
        age = tempAge as! Int //同理 any转成int
        print(name, age)
        //假设下面age没有赋值 上面的强制解包就会有问题
        if let age1 = dict["age"] as? Int {  //先判断是否有值
            age = age1
        }
        
        
        //as? 转成可选类型
        //as! 转成确定类型
    }
    
    //上面的方法为了大家理解 麻烦 用kvc
    init(dictory: [String : Any]) {
        super.init()
        setValuesForKeys(dictory)
    }
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
    //类的属性监听
    var score :String = "" {
        //即将改变
        willSet {
            print(score)
            print(newValue) //临时变量
        }
        //已经改变  通常只要这个就可以了
        didSet {
            print(score)
            print(oldValue) //临时变量
        }
    }
}
let p = Person()
let p1 = Person(name: "sa", age: 1)
print(p1.name,p1.age)

let p2 = Person(dict: ["name":"bbb", "age":12, "height":1.87])
print(p2.name, p2.age)

let pp = Person(dictory: ["name":"ss", "age":23, "height":1.23])
print(pp.age)

pp.score = "aa"
pp.score = "bb"

你可能感兴趣的:(iOS开发,swift,oc)