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

本機重點探討擴展的寫法

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

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

調用方式

  self.view.width
  self.view.height

分析:

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

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

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

調用:

    self.view.os_width
    self.view.os_height

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

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

提示:

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

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

提示:

Auto 是一個泛型的結構體,Self 代表誰實現了協議Compatible 這個Self 就是誰

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

注意:

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

  • 第五步 讓UIView 實現協議
extension UIView:Compatible{ 
}

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

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

運行結果:

375.0
667.0

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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