91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swift2.0(13)構造方法

發布時間:2020-03-22 17:50:11 來源:網絡 閱讀:319 作者:ymanmeng123 欄目:移動開發
  • 構造方法

實例對象在被創建時,需要對存儲屬性初始化,兩種方式:

     方法一:在聲明屬性的同時設定初值(之前一直使用這種方式)

     方法二:使用構造方法

構造方法init:在對象創建時自動調用并對實例對象的存儲屬性進行初始化

     a. 無需func關鍵字聲明

     b. 參數列表里可以有多個參數,也可以沒有參數,參數可以有默認值

     c. 支持重寫和重載

     d. 沒有返回值

     如:

    class Person{
       
var name:String
       
var age:Int
       
init(name:String, age:Int) {
           
self.name = name
           
self.age = age
        }
       
init(name1:String) {
           
self.name = name1
           
self.age = 11
        }
       
init(name2:String) {
           
self.name = name2
           
self.age = 12
        }
       
init() {
           
self.name = "123"
           
self.age = 20
        }
    }
   
var p1:Person = Person()
   
print("name:\(p1.name) age:\(p1.age)")//name:123 age:20
    var p2:Person = Person(name1: "iOS")
   
print("name:\(p2.name) age:\(p2.age)")//name:iOS age:11
    var p3:Person = Person(name2: "iOS")
   
print("name:\(p3.name) age:\(p3.age)")//name:iOS age:12
    var p4:Person = Person(name: "iPhone", age: 7)

    print("name:\(p4.name) age:\(p4.age)")//name:iPhone age:7

     init()方法是強制包含外部參數名的,即使未顯式寫出,也是有的,相當于參數名前有#,可以使用 _ 關閉這個強制功能

     這里有四個重載的init()方法,其中有兩個方法僅僅外部參數名不同,也可以進行重載(普通函數不可以)

     

構造方法中的常量:

     常量屬性,在構造方法內部是可以變的,即構造方法執行后才是真正的常量

     注意:子類的構造方法不能修改父類常量屬性的值


  • 構造方法的分類

默認構造方法:適用于類、結構體、枚舉

     當所有的存儲屬性都有默認值時由系統自動生成

     如果存儲屬性是一個可選類型,則不必設置默認值也能具有默認構造方法,其默認值為nil

指定構造方法:顯式地寫出并且可重載,需要為每個存儲屬性初始化

便捷構造方法:內部調用其他構造方法

     需要在init()前加convenience關鍵字聲明

     只有在便捷構造方法中可以顯式調用構造方法,如:

     convenience init() {

          self.init(name:"123", age:20)

     }

可失敗構造方法:在某些情況下構造對象失敗后,返回nil

     返回nil,意味著返回值類型是一個可選類型,語法:init?()

     可失敗構造方法可以聲明為便捷構造方法

     如:

     convenience init?(age:Int) {

          self.init(name:"123", age:age)

          if ( age < 0 ) {

               return nil

          }

     }

     var p1:Person? = Person(age: 5)

     隱式解綁的可失敗構造方法,即返回值是解綁后的,語法init!()

          也就意味著返回值不再是一個可選類型,也就意味著可失敗構造方法返回nil程序會崩潰


  • 繼承中的構造過程

先來看一段代碼:

    class Animal {
       
var age:Int
       
init() {
           
self.age = 10
           
print("Animal init.")
        }
    }
   
class Dog:Animal {
       
var name:String
       
override init() {
           
self.name = "abc"
           
print("Dog init.")
        }
    }
   
var p = Dog()

    print("age:\(p.age) name:\(p.name)")

     輸出的結果:

          Dog init.

          Animal init.

          age:10 name:abc

     重要說明:子類的構造方法一定調用了父類的構造方法完成父類部分的初始化

父子類構造方法的調用順序:

     上面例子中,在子類的init()中并沒有顯式調用,則父類的init()實在子類init()的最后隱式調用

     存在的問題是:在子類的init()中不能訪問父類的屬性

     解決方法:子類的init()中顯式調用父類構造方法     

        override init() {
           
self.name = "abc"
           
super.init()
           
self.age++
           
print("Dog init.")

        }

     需要注意的是:顯式調用父類構造方法,必須在子類存儲屬性初始化后進行

子類也可以添加構造方法,子類構造方法內部也可以指定調用其他構造方法

    class Animal {
       
var age:Int
       
init() {
           
self.age = 10
        }
       
init(age:Int) {
           
self.age = age
        }
    }
   
class Dog:Animal {
       
var name:String
       
override init() {
           
self.name = "abc"
           
super.init()
           
self.age++
        }
       
init(age:Int, name:String) {
           
self.name = name
           
super.init(age: age)
        }
       
    }
   
var p = Dog(age: 22, name: "ABC")

    print("age:\(p.age) name:\(p.name)")


  • 析構方法

與構造方法相反,對象即將被銷毀前,會自動調用析構方法

     a. 析構方法 deinit 不帶任何參數也沒有返回值,不用func修飾

     b. 有默認析構方法,也可以顯式寫出代替

     c. 析構方法不能重載

     d. 子類實例對象銷毀時,先調用子類的析構方法,再調用父類的析構方法

     e. 任何位置都不能顯式調用deinit

    class Animal {
       
var age:Int
       
init() {
           
self.age = 10
        }
       
init(age:Int) {
           
self.age = age
        }
       
deinit {
           
print("Animal deinit.")
        }
    }
   
class Dog:Animal {
       
var name:String
       
override init() {
           
self.name = "abc"
           
super.init()
           
self.age++
        }
       
init(age:Int, name:String) {
           
self.name = name
           
super.init(age: age)
        }
       
deinit {
           
print("Dog deinit")
        }
    }
   
var p = Dog(age: 22, name: "ABC")

    print("age:\(p.age) name:\(p.name)")

    p = Dog()     //基于ARC機制,此時上一個Dog實例對象被銷毀

     輸出結果:

          age:22 name:ABC

          Dog deinit

          Animal deinit.


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江达县| 枣强县| 永济市| 微山县| 松阳县| 紫金县| 浑源县| 霍州市| 大安市| 乐业县| 乌鲁木齐县| 阿克苏市| 盐山县| 北安市| 福建省| 芜湖市| 项城市| 正阳县| 托克托县| 黑水县| 焉耆| 理塘县| 唐海县| 麦盖提县| 新郑市| 花莲县| 贵港市| 贡山| 宁化县| 江山市| 桐柏县| 罗平县| 余庆县| 乐昌市| 巴东县| 武穴市| 诏安县| 漾濞| 洪雅县| 宜阳县| 绥芬河市|