2020-04-08 類與屬性

類型定義的語法

struct SomeStructure {
    // 在這里定義結構體
}
class SomeClass {
    // 在這里定義類
}

注:通過 struct 關鍵字引入結構體
通過 class 關鍵字引入類

class Person{
    //定義屬性
    var name:String = ""
    var sex:String = ""
    var age:Int = 0
    //定義方法
    func say(){
        print("你好")
    }
}

實例化對象

var p1 = Person()
//訪問屬性和方法
p1.name = "張三"
p1.sex = "男"
p1.age = 18
print(p1.name)
print(p1.age)

引用類型

var p2 = p1 
p2.name = "小紅"
p2.sex = "女"
p2.age = 13
print(p1.name)
print(p1.sex)
print(p1.age)

判斷是否為同一個實例

print(p1===p2)//true
let p3 = Person()
print(p1===p3)//false

注:相同(===)
不相同(!==)

存儲屬性:可以是一個常量或者變量
可以指定默認值,或可以在構造方法里初始化
計算屬性:除存儲屬性外,類、結構體和枚舉可以定義計算屬性
不直接存儲值,提供一個 getter 和一個可選的 setter,來間接獲取和設置其他屬性或變量的值。

class Student{
    //存儲屬性
    var age:Int = 0
    var javaScore:Double = 0.0
    var htmlScore:Double = 0.0
    
    //計算屬性
    var averageScore:Double {
        //獲取值
        get{
            print("get被調用")
            return (javaScore+htmlScore)/2  //get中必須有return語句
        }
        //賦值
        set{
            print("set被調用,\(newValue)")
            //self.averageScore = newValue  不要再set里給計算屬性賦值,否則死循環(huán)
        }
    }
    
    
    //只讀計算屬性
    var averageScore2:Double {
        //獲取值
        get{
            print("get被調用")
            return (javaScore+htmlScore)/2  
        }
       
    }
    //只讀計算屬性-省略get{}
    var averageScore3:Double {
        //獲取值
            print("get被調用")
            return (javaScore+htmlScore)/2  
    }
    
    //類屬性
    static var courseCount:Int = 2
    
}
var stu = Student()
//使用存儲屬性
stu.age = 18
stu.javaScore = 90
stu.htmlScore = 60

//使用計算屬性
print(stu.averageScore)
stu.averageScore = 100

//只讀計算屬性
print(stu.averageScore2)
print(stu.averageScore3)

//使用類屬性
print(stu.courseCount)//不能通過對象訪問
print(Student.courseCount)

懶加載屬性

class CloseRange{
    var start:Int = 0
    var end:Int = 1000
    //方案:result設計為計算屬性
    var result:Int{
        get{
            print("開始計算...")
            var res = 0
            //此時采用求和操作來模擬進行大量計算。
            for i in self.start...self.end{
                res += i
            }
            return res
        }
    }

var range = CloseRange()
print(range.result)
print(range.result)
print(range.result)
print(range.result)

屬性觀察器

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("將 totalSteps 的值設置為 \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("增加了 \(totalSteps - oldValue) 步")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// 將 totalSteps 的值設置為 200
// 增加了 200 步
stepCounter.totalSteps = 360
// 將 totalSteps 的值設置為 360
// 增加了 160 步
stepCounter.totalSteps = 896
// 將 totalSteps 的值設置為 896
// 增加了 536 步

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容