swift-day07-類和結(jié)構(gòu)體

  • Swift 并不要求你為自定義類和結(jié)構(gòu)去創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件。你所要做的是在一個(gè)單一文件中定義一個(gè)類或者結(jié)構(gòu)體,系統(tǒng)將會(huì)自動(dòng)生成面向其它代碼的外部接口,通常一個(gè)類的實(shí)例被稱為對(duì)象。然而在 Swift 中,類和結(jié)構(gòu)體的關(guān)系要比在其他語(yǔ)言中更加的密切,本章中所討論的大部分功能都可以用在類和結(jié)構(gòu)體上。因此,我們會(huì)主要使用實(shí)例而不是對(duì)象。
  • 類和結(jié)構(gòu)體對(duì)比
    Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)。共同處在于:
    1.定義屬性用于存儲(chǔ)值
    2.定義方法用于提供功能
    3.定義附屬腳本用于訪問(wèn)值
    4.定義構(gòu)造器用于生成初始化值
    5.通過(guò)擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
    6.實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
    7.與結(jié)構(gòu)體相比,類還有如下的附加功能:
    8. 繼承允許一個(gè)類繼承另一個(gè)類的特征
    9.類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型
    10.析構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源
    引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用,結(jié)構(gòu)體總是通過(guò)被復(fù)制的方式在代 碼中傳遞,不使用引用計(jì)數(shù)。
    /*
    定義類
    class SomeClass {
    // class definition goes here
    }
    定義結(jié)構(gòu)體
    struct SomeStructure {
    // structure definition goes here
    }
    */
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //,Swift 并不要求你為自定義類和結(jié)構(gòu)去創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件。你所要做的是在一個(gè)單一文件中定義一個(gè)類或者結(jié)構(gòu)體,系統(tǒng)將會(huì)自動(dòng)生成面向其它代碼的外部接口,通常一個(gè)類的實(shí)例被稱為對(duì)象。然而在 Swift 中,類和結(jié)構(gòu)體的關(guān)系要比在其他語(yǔ)言中更加的密切,本章中所討論的大部分功能都可以用在類和結(jié)構(gòu)體上。因此,我們會(huì)主要使用實(shí)例而不是對(duì)象。
        //類和結(jié)構(gòu)體對(duì)比
//        Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)。共同處在于:
//        定義屬性用于存儲(chǔ)值
//        定義方法用于提供功能
//        定義附屬腳本用于訪問(wèn)值
//        定義構(gòu)造器用于生成初始化值
//        通過(guò)擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
//        實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
//        與結(jié)構(gòu)體相比,類還有如下的附加功能:
//        繼承允許一個(gè)類繼承另一個(gè)類的特征
//        類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型
//        析構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源
//        引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用,結(jié)構(gòu)體總是通過(guò)被復(fù)制的方式在代碼中傳遞,不使用引用計(jì)數(shù)。
        /*
        定義類
        class SomeClass {
        // class definition goes here
        }
        定義結(jié)構(gòu)體
        struct SomeStructure {
        // structure definition goes here
        }
        */
        //**************************結(jié)構(gòu)體***************************
        //定義一個(gè)結(jié)構(gòu)體,在 Swift 中,所有的結(jié)構(gòu)體和枚舉類型都是值類型。這意味著它們的實(shí)例,以及實(shí)例中所包含的任何值類型屬性,在代碼中傳遞的時(shí)候都會(huì)被復(fù)制。
        //swift的結(jié)構(gòu)體中可以 定義成員變量 和成員變量方法
        //內(nèi)部有構(gòu)造函數(shù) 但是沒(méi)有析構(gòu)函數(shù)
        //結(jié)構(gòu)體類型
        //結(jié)構(gòu)體中的成員變量 必須要初始化
        //1.在定義成員變量的時(shí)候初始化 2.或者在構(gòu)造函數(shù)中初始化
        struct MYStudents{
             //在定義的時(shí)候可以初始化成員變量
            var age:Int = 0;
            var height:Int = 0;
             //內(nèi)部自動(dòng)會(huì)實(shí)現(xiàn)一個(gè)無(wú)參的構(gòu)造 和 帶參數(shù)的構(gòu)造
        }
        //創(chuàng)建一個(gè)結(jié)構(gòu)體變量
        var xiaohong:MYStudents = MYStudents();//里面會(huì)自動(dòng)調(diào)用 內(nèi)部的init()無(wú)參的構(gòu)造
        //獲取成員變量的值 通過(guò)'.'獲取
        print("xiaohong_age = \(xiaohong.age) height = \(xiaohong.height)")//xiaohong_age = 0 height = 0
        
        //直接用點(diǎn)操作
        //對(duì)成員變量賦值
        xiaohong.age = 24
        xiaohong.height = 170
        print("xiaohong_age = \(xiaohong.age) height = \(xiaohong.height)")//xiaohong_age = 24 height = 170
        
        var xiaohuang:MYStudents = MYStudents(age: 25, height: 180) //會(huì)自動(dòng)調(diào)用內(nèi)部的帶參數(shù)的構(gòu)造
        print("xiaohuang_age = \(xiaohuang.age) height = \(xiaohuang.height)")//xiaohuang_age = 25 height = 180
        //下面我們自己實(shí)現(xiàn)構(gòu)造函數(shù)
        struct MyStu {
            var age:Int
            var height:Int
            //無(wú)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)前不需要加func,一般也不要加要不然會(huì)報(bào)錯(cuò)系統(tǒng)
             init() {
              
                print("無(wú)參數(shù)的構(gòu)造函數(shù)");
//                age = 18;
//                height = 175;
                //建議用self.xxx
                self.age = 18;
                self.height = 15;
            
            
            }
            //帶參數(shù)的構(gòu)造函數(shù)
            //有參數(shù)的構(gòu)造函數(shù)調(diào)用的時(shí)候 會(huì)自動(dòng)加標(biāo)簽
            init(age:Int,height:Int){
                //因?yàn)閹?shù)的構(gòu)造 的參數(shù)名 經(jīng)常和成員變量同名 所以下面在賦值時(shí)建議使用self.age
                //在結(jié)構(gòu)體內(nèi)部操作成員變量一般都是使用self.xxx
                self.age = age;
                self.height = height;
                print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用")
            }
            //一個(gè)結(jié)構(gòu)體中可以有多個(gè) 構(gòu)造函數(shù)
             /*參數(shù)名也可以起其他的名字
            init(newage:Int,newheight:Int){
                //因?yàn)閹?shù)的構(gòu)造 的參數(shù)名 經(jīng)常和成員變量同名 所以下面在賦值時(shí)建議使用self.age
                //在結(jié)構(gòu)體內(nèi)部操作成員變量一般都是使用self.xxx
                self.age = newage;
                self.height = newheight;
                print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用")
            }
           */
            //可以定義其它方法
            func sleep(){
            
                print("呼呼大睡")
            }
            mutating func jump(){
                
                self.age = 10;//在其他函數(shù)中默認(rèn)是不能修改成員變量的值的,如果結(jié)構(gòu)體中的函數(shù)要修改成員變量 那么在定義的時(shí)候嵌套加mutating 關(guān)鍵字,現(xiàn)在swift版本不加這個(gè)關(guān)鍵字改變成員變量的值回報(bào)錯(cuò)的,所以這個(gè)問(wèn)題系統(tǒng)就會(huì)幫我們提示
            }
        
        }
        var stu1:MyStu = MyStu()//自動(dòng)調(diào)用內(nèi)部的init()無(wú)參的構(gòu)造
        print("stu1_age=\(stu1.age),stul_height = \(stu1.height)")// stu1_age=18,stul_height = 15
        //有參數(shù)的構(gòu)造函數(shù)的調(diào)用
        var stu2:MyStu = MyStu(age: 22, height: 175)//有參數(shù)的構(gòu)造函數(shù)被調(diào)用
        //調(diào)用結(jié)構(gòu)體的方法
        stu1.sleep();//呼呼大睡
        stu2.jump()
       print("stu2_age=\(stu2.age),stu2_height = \(stu2.height)")//stu2_age=10,stu2_height = 175
        //**************************************************類**************************************************
        //不需要繼承NSObject,類是引用類型
        //類 和 結(jié)構(gòu)體的定義 很像 但是 類 有繼承 有析構(gòu)函數(shù)等等
        //swift 中的 成員變量 可以沒(méi)有setter和getter 函數(shù)  就可以直接 通過(guò). 來(lái)方法
        //swift 中的setter和getter 是用于計(jì)算屬性的 (計(jì)算屬性 不存儲(chǔ) 數(shù)據(jù) 用于計(jì)算數(shù)據(jù))
        class Person{
        //聲明變量
            var age:Int = 0;//可以在這里初始化也可以在構(gòu)造函數(shù)里面
            var score:Double;
            var name:NSString?//可以用可選值
        //類 有無(wú)參數(shù)的構(gòu)造函數(shù)和有參數(shù)的構(gòu)造函數(shù)
        //一個(gè)類可以有多個(gè)構(gòu)造函數(shù)
            init(){
               //建議內(nèi)部訪問(wèn)成員變量用self.xxx
                self.age = 22;
                self.score = 100;
                self.name = "pengpeng";
                print("無(wú)參數(shù)的構(gòu)造函數(shù)被調(diào)用")
            
            
            }
            //有參數(shù)的構(gòu)造
            init(age:Int,score:Double,name:String){
                self.age = age;
                self.score = score;
                self.name = name;
                print("有參數(shù)的構(gòu)造函數(shù)被調(diào)用");
            }
            //獲取成員變量的值  實(shí)際上這樣的函數(shù) 可以不用寫(xiě)
            //swift中 對(duì)象可以通過(guò)點(diǎn)來(lái)操作 成員變量
            //這是 和OC 不同的地方
            func getAge() ->Int{
                return self.age;
              
            }
            //成員方法
            func writeCode(){
                print("正在快樂(lè)的敲代碼")
            
            }
            //修改成員變量
            //普通方法也可以叫實(shí)例方法
            func changeScoreToZero(){
                  //類中的普通方法可以 直接修改成員變量 和結(jié)構(gòu)體不一樣 結(jié)構(gòu)體需要加 mutating
                self.score = 0.0;
                print("score = \(self.score)");
                
            
            
            }
            //swift 中的類方法 /和OC的類方法 類似/和c++的靜態(tài)方法類似
            //類方法前 加 class
            //類方法是由類調(diào)用的方法 是和對(duì)象無(wú)關(guān)的方法
            class func hh() {
                print("這是類方法")
            }
            //swift 還有析構(gòu)函數(shù)
            //對(duì)象銷毀的時(shí)候自動(dòng)調(diào)用函數(shù)就是析構(gòu)函數(shù)
            deinit{
                    print("對(duì)象銷毀調(diào)用析構(gòu)")
            
            }
        }
        //設(shè)計(jì)類的時(shí)候 成員變量也必須要初始化
        //全局變量
        var pengpeng:Person = Person();//自動(dòng)調(diào)用無(wú)參數(shù)的構(gòu)造
        func test(){
           //類名調(diào)用類方法
            Person .hh()
            //局部變量
            //peng變量引用一個(gè)Person對(duì)象
            ////Person()會(huì)創(chuàng)建對(duì)象  語(yǔ)句的含義 表示把一個(gè)Person類的對(duì)象一個(gè)引用 給xpeng
            //peng 和 OC中的對(duì)象指針類似
            var peng:Person = Person()
            //newPeng和peng引用的是同一個(gè)對(duì)象
            var newPeng:Person = peng;
            //獲取成員變量的值 可以直接用 .操作
            //不需要寫(xiě) OC中的setter和getter方法
            print("age:\(peng.age) name:\(peng.name!) score = \(peng.score)")
            //修改值
            peng.age = 24
            peng.name = "peng"
            peng.score = 100.0
            print("age:\(peng.age) name:\(peng.name!) score = \(peng.score)")
            
           
            peng.writeCode()
            
            //創(chuàng)建對(duì)象 用有參數(shù)的構(gòu)造
            var xiaofen:Person = Person(age: 20, score: 99, name: "xiaofen")
            print("xiaofen_age:\(xiaofen.age) name:\(xiaofen.name!) score = \(xiaofen.score)")
        
        
        }
        test()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容