亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

深入解析Swift編程中的構造方法

2020-03-09 17:48:21
字體:
來源:轉載
供稿:網友

一、引言
構造方法是一個類創建對象最先也是必須調用的方法,在Objective-C中,開發者更習慣稱這類方法為初始化方法。在Objective-C中的初始化方法與普通函數相比除了要以init抬頭外并無太嚴格的分界,而在Swift語言體系中,構造方法與普通的方法分界十分嚴格,從格式寫法上就有不同,普通方法函數要以func聲明,構造方法統一為init命名,不需要func關鍵字聲明,不同的構造方法采用方法重載的方式創建。

二、構造方法的復寫與重載
在Objective-C中,不同的初始化方法就是不同的函數,這便不存在方法重載的概念。Swift中要創建自定義的構造方法,需要開發者對init構造方法進行重載操作。任何一個自定義的類,只要其有父類,除了可以繼承下來父類已有的構造方法外,還可以復寫父類的構造方法,使其適用于自身。和Objective-C類似,復寫父類的構造方法時,要在其中調用父類的構造方法,重載可以理解為一種特殊的復寫父類構造方法,因此在重載的構造方法中也要調用父類的構造方法。

創建一個繼承于NSObject的類,復寫構造方法,代碼示例如下:

class ClassOne: NSObject {  //聲明一個本類特有的常量  var tip:Int  //復寫父類的構造方法 需要用override關鍵字  override init() {    //構造方法中要對所有成員常量完成創建    tip = 1;    //在創建完所有成員常量后 調用父類構造方法    super.init()  }  //重載構造方法1  init(one:Int){    tip=one    super.init()  }  //重載構造方法2 使用convenience關鍵字進行修飾  convenience init(two:String) {    //使用convenience關鍵字進行修飾的構造方法要調用本類的構造方法進行    self.init(one: two.characters.count)  }  //重載構造方法3 使用required關鍵字進行修飾 使用required關鍵字進行修飾的構造方法子類必須繼承或復寫  required init(three:Float) {    tip=10    super.init()  }

上面示例代碼中,不帶參數的init()方法為復寫父類的方法,因此需要使用關鍵字override來修飾。重載構造方法1帶一個Int類型的 參數,父類中并沒有這個構造方法,但是在其實現中,依然需要調用父類中的某個構造方法完成。構造方法2是一個帶String類型參數的構造方法,其用convenience關鍵字為構造方法的一個修飾關鍵字,后面會介紹。構造方法3為一個帶Float類型參數的構造方法,但其使用required關鍵字進行了修飾,使用required關鍵字進行修飾的構造方法子類必須繼承或者復寫。構造方法1,2,3都是對init()構造方法的一種重載,但卻是3中類型全然不同的構造方法。

三、Designated構造方法與Convenience構造方法

Swift中的構造方法分為Designated構造方法與Convenience構造方法兩類,Designated構造方法也被稱為指定構造方法,Convenience構造方法也被稱為方便構造方法。Designated構造方法不加任何修飾關鍵字,Convenience構造方法需要使用Convenience關鍵字進行修飾??梢赃@樣理解,Convenience類型的構造方法是為了方便使用從Designated構造方法中分支出來的構造方法,官方文檔中有如下描述:

1.子類Designated構造方法中必須調用父類的Designated構造方法。

2.Convenience構造方法中必須調用當前類的構造方法。

3.Convenience構造方法歸根結底要調用到Designated構造方法。

官方文檔的一張圖可以清晰的描述上述關系:

Swift,構造方法,init

四、構造方法的繼承關系

關于子類繼承父類的構造方法有這樣幾個特性:

1.如果子類沒有復寫任何父類的構造方法,則默認子類將繼承所有父類的構造方法,包括Designated構造方法與Convenience構造方法。

2.如果子類復寫了父類某一構造方法,則子類默認不在繼承所有父類的構造方法,對于Designated類型的構造方法,子類復寫了哪些,哪些才能夠被使用,對于Convenienve類型的構造方法,子類復寫的其調用的Designated構造方法后會被自動繼承。

3.如果父類中的構造方法是required修飾的,則子類必須進行繼承或復寫。

曾經有朋友和我抱怨,Objective-C中的繼承是一種十分不人性,它強制子類繼承所有父類的方法與屬性無論子類是否需要,分析上面的一些規則可以發現,Swift與Objective-C相比,在構造方法方面語法會更加嚴格,這樣做在編程上更加安全。在Objective-C中,子類將被強制繼承所有父類的初始化方法,這樣開發者在使用時常常會出現疑惑,有時一個子類往往有特定的初始化方法,僅僅通過父類的初始化方法不能夠正確的完成初始化,在編程時,往往需要特殊注釋來提示開發者。Swift設定的這些構造方法原則可以將無關的父類構造方法剔除在外,在編程時更加嚴格安全,減少疑惑與不可控因素。

五、構造方法的實現原則

無論Designated類型的構造方法還是Convenience類型的構造方法,只要其有父類,最終都要實現父類的Designated構造方法。Swift語言要求,在構造方法中要完成所有成員常量或者變量的構造或賦值(optional值除外)。在對成員常量或變量進行構造賦值時,要在調用父類的初始化方法之前,這里還有一點需要注意,父類的成員屬性也會被子類繼承,如果要在子類復寫的父類方法中對繼承來的父類成員屬性進行重新構造或賦值,則必須在調用父類構造方法之后,例如創建ClassTwo類繼承于ClassOne,復寫方法如下:

class ClassTwo: ClassOne {  //子類自己的屬性  let tipTwo:Int  override init() {    //調用父類構造方法前進行自己屬性的構造    tipTwo = 1    //調用父類構造方法    super.init()    //對從父類繼承來的屬性進行重構造    tip = 1000;  }    required init(three: Float) {    fatalError("init(three:) has not been implemented")  }  }

Swift語言這種強制化得構造規則,能夠保證一個類在完成構造時,其內部的所有屬性都構造完成。在使用Objective-C進行開發時,很多初學者都可能會遇到這樣一種情況,完成了某個類的初始化,但向類的屬性進行賦值時卻沒有成功,因為Objective-C中并沒有這樣的語法,在類初始化成功后,其屬性是否初始化了完全取決于開發者,Swift優化了這一設計。

綜上可以了解,Swift語言雖然更加嚴格,卻將更多本來需要開發者注意的地方交由了編譯器,實際上是減輕了開發者的負擔。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费淫片aa视频免费| 国产亚洲精品va在线观看| 国内精品视频久久| 国产精品扒开腿做| 久久久久国产精品免费| 5566成人精品视频免费| 国产精品色悠悠| 亚洲色在线视频| 中文字幕无线精品亚洲乱码一区| 欧洲美女免费图片一区| 91高清视频免费观看| 日韩亚洲精品电影| 亚洲国产一区二区三区在线观看| 国产精品高潮呻吟视频| 日韩久久午夜影院| 国产精品视频精品视频| 亚洲缚视频在线观看| 97久久精品国产| 日本午夜在线亚洲.国产| 成人乱人伦精品视频在线观看| 国产精品aaa| 欧美大人香蕉在线| 日本久久91av| 91精品国产网站| 伊人伊人伊人久久| 黑人巨大精品欧美一区二区一视频| 国产免费一区二区三区在线观看| 北条麻妃一区二区在线观看| 亚洲第一色中文字幕| 高清视频欧美一级| 日本欧美一级片| 成人精品一区二区三区电影黑人| 日韩高清电影免费观看完整版| 欧美日产国产成人免费图片| 富二代精品短视频| 亚洲性视频网址| 麻豆一区二区在线观看| 日韩动漫免费观看电视剧高清| 亚洲精品一区久久久久久| 91精品久久久久久久| 欧美高清视频在线播放| 一区二区三区国产视频| 亚洲国产精品成人精品| 国产精品第100页| 一区三区二区视频| 日韩高清a**址| 98精品国产自产在线观看| 成人网在线视频| 国模叶桐国产精品一区| 欧美精品一本久久男人的天堂| 成人黄色激情网| 正在播放亚洲1区| 日韩在线观看电影| 精品亚洲国产成av人片传媒| 国产精品久久久久久五月尺| 国产午夜精品免费一区二区三区| 欧美孕妇孕交黑巨大网站| 色婷婷av一区二区三区在线观看| 国产91免费看片| 538国产精品视频一区二区| 日韩欧美a级成人黄色| 国产91热爆ts人妖在线| 欧美高清在线观看| 国产精品三级美女白浆呻吟| 日本在线观看天堂男亚洲| xxxx欧美18另类的高清| 另类美女黄大片| 6080yy精品一区二区三区| 97久久精品人搡人人玩| 久久久精品亚洲| 亚洲天堂视频在线观看| 国产日韩欧美电影在线观看| 日韩大片免费观看视频播放| 高清在线视频日韩欧美| 国产精品一区av| 国产欧美日韩中文| 亚洲精品日韩欧美| 91亚洲精品一区| 久久国产精品亚洲| 亚洲最大福利网| 九九精品在线观看| 精品亚洲一区二区三区| 欧美激情aaaa| 久久精品人人爽| 欧美性猛交99久久久久99按摩| 日韩激情视频在线| www.亚洲成人| 日本久久久久亚洲中字幕| 国产做受69高潮| 欧美精品www| 亚洲美女在线视频| 欧美视频免费在线| 国产精品三级美女白浆呻吟| 少妇高潮久久77777| 91欧美视频网站| 精品国产乱码久久久久酒店| 亚洲跨种族黑人xxx| 欧美一级大片在线免费观看| 国产精品稀缺呦系列在线| 中文字幕精品网| 久久大大胆人体| 欧美精品电影在线| 久久亚洲精品中文字幕冲田杏梨| 亚洲国产精品系列| 国产v综合ⅴ日韩v欧美大片| 日韩av快播网址| 欧美做受高潮1| 亚洲aⅴ男人的天堂在线观看| 日韩视频在线一区| 亚洲国产天堂久久国产91| 亚洲韩国欧洲国产日产av| 性夜试看影院91社区| 尤物九九久久国产精品的分类| 亚洲天堂久久av| 欧美激情a在线| 欧美成人久久久| 久久精品视频免费播放| 热久久免费国产视频| 国产日韩在线亚洲字幕中文| 国内精品久久久久久久久| 亚洲一区中文字幕在线观看| 亚洲成人精品久久久| 成人网页在线免费观看| 26uuu亚洲国产精品| 国产精品伦子伦免费视频| 久久久久久久久久久久久久久久久久av| 粗暴蹂躏中文一区二区三区| 中文字幕精品在线视频| 日本乱人伦a精品| 国产精品高潮呻吟视频| 亚洲欧美在线第一页| 午夜精品一区二区三区在线| 色婷婷综合成人| 日韩欧美在线视频免费观看| 国产成人鲁鲁免费视频a| 2020欧美日韩在线视频| 欧美激情在线视频二区| 日韩精品亚洲元码| 精品夜色国产国偷在线| 国产日韩综合一区二区性色av| 久久亚洲精品成人| 国产精品欧美在线| 国产性猛交xxxx免费看久久| 一级做a爰片久久毛片美女图片| 色妞久久福利网| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产成人精品久久久| 久久精品色欧美aⅴ一区二区| 欧美日韩一区二区三区在线免费观看| 国产精品免费网站| 亚洲最新av在线网站| 国产成人福利网站| 欧美激情一区二区三区在线视频观看| 欧美激情精品久久久| 日韩在线资源网| 亲子乱一区二区三区电影| 亚洲第一页自拍| 国产成人aa精品一区在线播放| 欧美亚洲激情在线| 亚洲欧美国产精品久久久久久久| 欧美激情综合色综合啪啪五月| 欧美成人免费全部观看天天性色| 欧美限制级电影在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整|