pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Swift學(xué)習(xí)教程之訪問控制詳解

訪問控制可以限定你在源文件或模塊中訪問代碼的級別,也就是說可以控制哪些代碼你可以訪問,哪些代碼你不能訪問。下面這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之訪問控制的相

前言

本文主要給大家介紹了關(guān)于Swift訪問控制的相關(guān)內(nèi)容,訪問控制對訪問你的其他代碼源文件和模塊部分進行了約束。這個特性允許你隱藏你的代碼實現(xiàn),并且指定通過其可以訪問和使用該代碼的優(yōu)選接口。

class,structure 和 enumeration 都可以指定訪問級別,當(dāng)然,property,method,initializer 和 屬于這里類型的 subscript。protocol 可以限制到某個上下文,全局變量,變量和函數(shù)也可以。

另外,Swift 也提供默認的使用級別給典型的使用場景。確實,如果你編寫一款單一目標的 app,你可能根本不需要明確地指定訪問控制級別。

模塊和源文件

Swift的訪問控制模型是基于模塊和源文件的概念。

一個模塊是單個的代碼分布單元————一個 framework 或者應(yīng)用程序是作為單個單元編譯和傳遞的,他們能夠通過 Swift 的 import 關(guān)鍵字被其他模塊導(dǎo)入。

在Swift 中, Xcode的每一個 build target(如 一個 app bundle 或者 framework)被當(dāng)成一個單獨的模塊。

雖然通常做法是在不同的源文件定義不同的類型,然而一個源文件事實上可以包含不同的類型,函數(shù)等的定義。

訪問級別

Swift 為你的代碼實體提供5個不同的訪問級別:

  • Open 訪問和 public 訪問允許實體能夠被使用在任何來自起決定作用的模塊的源文件,或者來自于其他被導(dǎo)入的模塊的源文件。通常使用 open 或者 public 來指定framework 的公開接口。兩者的不同點將在下面進行描述。
  • Internal 訪問允許實體被使用在他們定義模型的任何源文件里面,但是不能在模塊外部的任何源文件使用。通常在定義一個 app 或者一個 framework 的內(nèi)部結(jié)構(gòu)的時候使用 internal 訪問。
  • File-private 訪問限制了在定義源文件中實體的使用。使用 file-private 訪問來隱藏特定功能的實現(xiàn)細節(jié),當(dāng)這些細節(jié)在整個文件中使用的時候。
  • Private 訪問將實體的使用限制在封閉聲明中。使用 private 訪問來隱藏特定功能的實現(xiàn)細節(jié),當(dāng)這些細節(jié)在單個聲明使用時。

Open 訪問是最高訪問級別,private 是最低訪問級別(最大限制性)。

Open 訪問只用在類和類成員,他和 publick 訪問的區(qū)別如下:

  • 使用 public 訪問的類, 或者其他更多限制性的訪問級別,只能在定義的模塊內(nèi)創(chuàng)建子類。
  • 使用 public 訪問的類成員,或者其他更多限制性的訪問級別,只能在定義的模塊內(nèi)被其子類重寫。
  • Open 類可以被定義的模塊或者其他 import 該模塊的地方創(chuàng)建子類。
  • Open 類成員可以被定義的模塊或者其他 import 該模塊的地方創(chuàng)建的子類重寫。

簡單來說就是 public 和 open 的區(qū)別就是public 比 open 少了模塊外的類繼承和類成員重寫的權(quán)限。

訪問級別的指導(dǎo)原則

在 Swift 中,訪問級別遵從總的指導(dǎo)原則是:沒有實體可以被定義在另外一個擁有較低訪問級別(更多限制)的實體之內(nèi)。

例如:

  • public變量不能被定義為具有internal, file-private或者 private 類型,因為這種類型可能不能用在使用公共變量的任何地方。
  • 函數(shù)不能具有比其他參數(shù)類型和返回類型更高的訪問級別,因為該函數(shù)可以在其組成類型不可被周圍代碼使用的情況下使用。

下面會有更詳細的介紹。

默認的訪問級別

如果你自己沒有指定一個明確的訪問級別,所有代碼中的實體都有一個默認的internal訪問級別。結(jié)果,在很多情況下你不需要對你的代碼指定明確的訪問級別。

單目標應(yīng)用程序的訪問級別

如果你寫的是一個 i 簡單的單目標應(yīng)該程序,那么你的程序代碼就是典型的自包含程序,并不需要在程序模塊的外部進行使用。默認的訪問級別 internal 已經(jīng)滿足這個需求。因此,你不需要去指定一個訪問級別。然而,你可能需要把你部分的代碼標記為文件私有或者私有,從而使得在程序模塊中的其他代碼隱藏他們的實現(xiàn)細節(jié)。

Frameworks 的訪問級別

當(dāng)你開發(fā)一個 framework,標記 open 或者 public 以便它能夠被其他模塊訪問到,例如某個程序引入這個 framework 的時候。這個面向公眾的接口是framework 的程序編程接口(或者 API)。

值得注意的是:任何 framework 的內(nèi)部實現(xiàn)細節(jié)都還可以使用默認的內(nèi)部訪問級別,或者可以標識為私有或者文件私有級別,如果你想對framework 的其他部分內(nèi)部代碼隱藏他們的話。只有當(dāng)你想讓一個實體成為你的 framework 的 API 的一部分的話,那么你就需要把這個實體標識為 open 或者 public。

單元測試目標的訪問級別

當(dāng)你寫的是一個包含單元測試目標的程序時,那么你需要讓你程序中的代碼可以被測試模塊使用到以便于測試。一般情況下,只有被標識為 open 或者 public 的實體才可以被其他模塊訪問到。然而,如果你把產(chǎn)品的模塊 import 聲明前加入 @testable 屬性并且在打開測試選項下編譯產(chǎn)品模塊的話,那么單元測試目標就能夠訪問任何的 internal 實體。

訪問級別語法

為實體定義訪問級別:


public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
 
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}

除非有其他的指定,否則的話默認的訪問基本是 internal,這也就意味著 SomeInternalClass 和 someInternalConstant 能夠在不明確訪問級別修飾符的情況下也還擁有 internal 的訪問級別:


class SomeInternalClass {}    // 隱式 internal
let someInternalConstant = 0   // 隱式 internal

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對html5模板網(wǎng)的支持。

翻譯自:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之類型對象Subject的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之Observable的相關(guān)資料,文中詳細的給大家介紹了關(guān)于新建Observable、訂閱Observable和取消訂閱并消除內(nèi)存泄漏等相關(guān)的內(nèi)容,需要的朋友可以
RxSwift是Swift函數(shù)響應(yīng)式編程的一個開源庫,由Github的ReactiveX組織開發(fā),維護。下面這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)之基礎(chǔ)篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需
這篇文章主要為大家詳細介紹了Swift4.0 Array數(shù)組的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
CATransition動畫主要在過渡時使用,比如兩個頁面層級改變的時候添加一個轉(zhuǎn)場效果。CATransition分為兩類,一類是公開的動畫效果,一類是非公開的動畫效果。這篇文章主要給大家介紹了
近日,iPhone X的發(fā)布在人們?nèi)罕娨鹆撕艽蟮霓Z動,下面這篇文章主要給大家介紹了關(guān)于利用Swift如何判斷iPhone X機型的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面
主站蜘蛛池模板: 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 高硼硅玻璃|水位计玻璃板|光学三棱镜-邯郸奥维玻璃科技有限公司 高温高压釜(氢化反应釜)百科 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 美名宝起名网-在线宝宝、公司、起名平台 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 好杂志网-首页| 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 高博医疗集团上海阿特蒙医院| 截齿|煤截齿|采煤机截齿|掘进机截齿|旋挖截齿-山东卓力截齿厂家报价 | 北京公司注册_代理记账_代办商标注册工商执照-企力宝 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 棉服定制/厂家/公司_棉袄订做/价格/费用-北京圣达信棉服 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 无缝方管|无缝矩形管|无缝方矩管|无锡方管厂家 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | 撕碎机,撕破机,双轴破碎机-大件垃圾破碎机厂家 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 湖南自考_湖南自学考试网 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | 电动葫芦-河北悍象起重机械有限公司 | 数控走心机-双主轴走心机厂家-南京建克 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! |