#Swift學習日記-面向協議編程swift初探

也不知道何時冒出了面向協議編程,很多文章都開始大談面向協議編程,拋棄了之前都還暢談面向對象編。也許一個技術用久了,就會漸漸表現出其不足之處,當這種不足讓人無法忍受,就會去尋找新的解決方法,來彌補現在的不足,一個新的事物也就因此而誕生。

面向對象,從開始接觸編程開始就要求用面向對象的思想去設計代碼,當類之間的關系變得越來復雜,類之間的繼承層級越來越深,就會出現類似樹形結構,當我們想重用樹形末端的代碼時,不得不把上層直至樹根的代碼一起添加,也不管有用沒用的代碼。面向協議編程,我的理解就是解除這種情況的出現,把功能分散開來,通過組合的方式來創建出一個類,讓這個類擁有它應該有的功能,分散出來的功能也可以在其他地方復用,不會引入過多的不必要的的代碼,當然這個取決于功能的粒度大小。

swift恰好支持面向協議編程特性,自己還需要從面向對象中走出了,認真理解,學習面向協議,更重要的是在實踐中去應用。下面就是對面向協議的一個簡單窺探吧,體驗它的好處

初體驗

這是一個簡單的demo。先看圖:

13.gif

當點擊登錄按鈕,兩個輸入框及按鈕都會左右抖動,然后一行提示文字漸漸顯示,最后在慢慢消失。可能最開始拿到這個需求,要么在點擊按鈕的時候分別對控件進行動畫控制或者自定義控件中添加動畫功能,這樣要么在控制器會有很多代碼,要么同樣一個抖動動畫代碼會出現在自定義的輸入框代碼中,也會出現在自定義按鈕的代碼中。本著不要重復造輪子的原則,面向協議就會很好解決這些問題。

1.自定義這三種控件的類,以此來添加動畫特效

// 自定義的輸入框類,遵守抖動協議
class SP_TextField: UITextField, SharkAnimation {

}
// 自定義的按鈕類,遵守抖動協議
class SP_Button: UIButton,SharkAnimation {
    
}
// 自定義label類,遵守漸變協議
class SP_Label: UILabel, FlashAnimation {
    
    
}

2.定義兩個協議

// 左右抖動協議
protocol ShakeAnimation {

}
// 由于動畫是加在view上的,所以要保證遵守的協議類必須是繼承自UIView,所以使用where限制
extension ShakeAnimation where Self : UIView {
    //抖動的方法的默認實現
    func shake()  {
        let shakeAni = CAKeyframeAnimation(keyPath: "transform.translation.x")
        
        shakeAni.values = [-8,0,8,0]
        shakeAni.duration = 0.25
        shakeAni.repeatCount = 5
        
        self.layer.add(shakeAni, forKey: nil)
        
    }
}

// 漸變的協議
protocol FlashAnimation {

}
// 同樣需要遵守的類是繼承自UIView的類
extension FlashAnimation where Self : UIView {
    // 漸變方法的默認實現
    func flash() {
        UIView.animate(withDuration: 0.25, animations: {
            self.alpha = 1.0
        }) { (isFinished) in
            UIView.animateKeyframes(withDuration: 0.25, delay: 2.0, options: [], animations: {
                self.alpha = 0.0
            }, completion: nil)
        }
    }
}

3.在控制器中使用

class ViewController: UIViewController {

    @IBOutlet weak var nameTextField: SP_TextField!
    
    @IBOutlet weak var passwordTextField: SP_TextField!
    
    @IBOutlet weak var tipLabel: SP_Label!
    
    @IBOutlet weak var loginButton: SP_Button!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    // 按鈕點擊事件
    @IBAction func buttonClick(_ sender: SP_Button) {
        
        // 點擊時直接調用就可以了
        nameTextField.shake()
        passwordTextField.shake()
        tipLabel.flash()
        loginButton.shake()
    }
}

4.如果以后還有其他控件,直接遵守協議,就擁有了抖動或者漸變的功能,是不是感覺很爽,很方便,復用性也強。當然這個功能的粒度需要自己掌控

這個是在學習中看到的一個示例,自己實現了一遍,是不是感覺很爽,擁抱面向協議吧。

獨立思考,不屈從世界,安靜內心,瘋子一樣行動,不理會周遭的嘈雜,有節奏的行走在coding~

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,593評論 25 707
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,147評論 4 61
  • 我自愿加入12306的逆天驗證碼! https://mp.weixin.qq.com/s/LyudUvg-ktJU...
    榮裕君閱讀 395評論 0 0
  • 阿黑來到學校的門口,正要往園區里進,沒成想卻被門衛給攔住了,因為平日里門口執勤的門衛都只是坐在崗亭之中,所以它稍微...
    說書客閱讀 110評論 0 0