Swift3.0 - 設計技巧_擴展深入

本機重點探討擴展的寫法

需求:給UIView 擴展一個獲取width 和height 的 屬性

extension UIView{
    var width:CGFloat{
        return self.frame.size.width
    }
    var height:CGFloat{
        return self.frame.size.height
    }
}

調(diào)用方式

  self.view.width
  self.view.height

分析:

調(diào)用方式非常簡單,但是但是,如果別人也寫了個一樣的擴展,或者系統(tǒng)框架以后也增加了一個這樣的屬性,你寫的這個就會報沖突的錯誤

有人說好辦,加個前綴,我們繼續(xù)改進一下

extension UIView{
    var os_width:CGFloat{
        return self.frame.size.width
    }
    var os_height:CGFloat{
        return self.frame.size.height
    }
}

調(diào)用:

    self.view.os_width
    self.view.os_height

這個是oc 延展過來的寫法,當然Swift 有自己更優(yōu)雅的寫法,過程有點復雜,我按照步驟寫

  • 第一步 創(chuàng)建一個泛型結(jié)構(gòu)體,里面定義一個屬性,接受傳進來的值
 struct Auto<Base>{
    let base:Base
    init(_ base:Base) {
        self.base = base
    }
  }
  • 第二步 定義一個協(xié)議
protocol Compatible{
    associatedtype CompatableType 
    var os: CompatableType { get } 
}

提示:

CompatableType 自定義變量 具體在實現(xiàn)時寫
os 這個一般寫自己的名字或者組織的名字

  • 第三步 實現(xiàn)這個協(xié)議
extension Compatible{
    var os:Auto<Self>{
        return Auto(self)
    }
}

提示:

Auto 是一個泛型的結(jié)構(gòu)體,Self 代表誰實現(xiàn)了協(xié)議Compatible 這個Self 就是誰

  • 第四步 寫擴展協(xié)議
extension Auto where Base: UIView{
    /// 擴展方法寫到這個
    var width:CGFloat{
        return self.base.frame.size.width
    }
    var height:CGFloat{
        return self.base.frame.size.height
    }
}

注意:

這個時候,你如果調(diào)用擴展的方法是掉不出來的,因為UIView 下載是沒有實現(xiàn)協(xié)議Compatible 所以不能調(diào)用os這個屬性, 剛才說Auto 是泛型,where 后面的意思就是Base 如果是UIView的類型己儒,這個擴展才有效,即給base 為UIView 類型的對象擴展屬性,這個時候系統(tǒng)會自動推斷Base 為UIView 類型,所以能調(diào)出frame的屬性

  • 第五步 讓UIView 實現(xiàn)協(xié)議
extension UIView:Compatible{ 
}

完成上面的五步,就完成了我們的擴展,看一下如何調(diào)用

 print(self.view.os.width)
 print(self.view.os.height)

運行結(jié)果:

375.0
667.0

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末额衙,一起剝皮案震驚了整個濱河市邦马,隨后出現(xiàn)的幾起案子脑溢,更是在濱河造成了極大的恐慌,老刑警劉巖席纽,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捏悬,死亡現(xiàn)場離奇詭異,居然都是意外死亡润梯,警方通過查閱死者的電腦和手機过牙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纺铭,“玉大人寇钉,你說我怎么就攤上這事〔芭猓” “怎么了扫倡?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長竟纳。 經(jīng)常有香客問我撵溃,道長,這世上最難降的妖魔是什么锥累? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任缘挑,我火速辦了婚禮,結(jié)果婚禮上揩悄,老公的妹妹穿的比我還像新娘卖哎。我一直安慰自己,他們只是感情好删性,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布亏娜。 她就那樣靜靜地躺著,像睡著了一般蹬挺。 火紅的嫁衣襯著肌膚如雪维贺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天巴帮,我揣著相機與錄音溯泣,去河邊找鬼。 笑死榕茧,一個胖子當著我的面吹牛垃沦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播用押,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肢簿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起池充,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桩引,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后收夸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑匠,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年卧惜,在試婚紗的時候發(fā)現(xiàn)自己被綠了厘灼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡咽瓷,死狀恐怖手幢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忱详,我是刑警寧澤围来,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站匈睁,受9級特大地震影響监透,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜航唆,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一胀蛮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯钙,春花似錦粪狼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至享潜,卻和暖如春困鸥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剑按。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工疾就, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艺蝴。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓猬腰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猜敢。 傳聞我的和親對象是個殘疾皇子姑荷,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,819評論 1 10
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫侮攀、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,121評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 那英:我買了很多保險厢拭,也給兒子買足!少兒超能寶2.0讓未來無憂 分享自 陳芳 2016年撇叁,火熱的中國好聲音改名成為...
    洪姐閱讀 115評論 0 0
  • 在《東方不斣赡帧:風云再起》里楞捂,一睹林青霞與王祖賢二人的絕代風華,我見尤憐趋厉,何況男人寨闹。只嘆戲中愛恨交織的三個人,被性格...
    一只呆的異想世界閱讀 324評論 0 0