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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章