Swift 3拡張プロトコルの初期プローブ-プロトコル向けプログラミング

2006 ワード

まずPersonプロトコルを定義します
protocol Person{
    var name:String {get}
    var age:Int {get}
    func personInfo() -> ()
}

まずTeacherクラスを定義します
class Teacher:Person{
    //  ,  name,age              ,          
    var name: String
    var age: Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    func personInfo() {
        print(name, "    ", age)
    }
}

Studentクラスもあります
class Student:Person{
    var name: String
    var age: Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    func personInfo() {
        print(name, "    ", age)
    }
}

使用時
var xiaoming = Teacher(name: "  ", age: 25)
xiaoming.personInfo()

var xiaohua = Student(name: "  ", age: 30)
xiaohua.personInfo()

私たちは発見して、実はpersonInfoこの関数の実現ロジックはすべて同じで、もしクラスが多いならば、そんなに多くの繰り返しのロジックがあって、しかしプロトコルの中でまた関数の実現部分を書くことができなくて、この問題を解決したいで、とても簡単で、プロトコルを拡張して
extension Person{
    func personInfo(){//  ,                ,        ,  ,          ,      
        print(name, "    ", age)
    }
}

プロトコルを拡張した後、Teacher、StudentクラスにpersonInfoという関数を書く必要はありません.プロトコル拡張は、書き方で実現したり、属性を拡張したりすることができます.例えば、私たちは一人があと何年退職するかを計算し、プロトコル拡張にget-onlyの計算属性を書きます.
var retireDistanceYear:Int{
        return 60 - age
    }

定年まであと何年かかるか
var xiaoming = Teacher(name: "  ", age: 25)
xiaoming.retireDistanceYear

ここで,プロトコルは書き込みインタフェースのみで論理を書くことができないという制限を破ったので,プロトコル向けのプログラミングというものがあり,オブジェクト向けプログラミングと比較して,プロトコルがオブジェクトに取って代わったと理解でき,オブジェクト向け,オブジェクトが論理を処理し,機能を実現することであり,面向プロトコルはオブジェクトがどのような機能を実現したいのか,関連機能を実現するプロトコルに直接従えばいいので、オブジェクト向けよりも柔軟です.1つの例は対象に向かって、1つの武器庫、すべての武器はすべて1つの対象で、あなたはどんな機能がほしいですか、直接対応する武器を持ってもいいです.機能はすでに武器の中でパッケージされているので、プロトコルに向かって、1つの発射器があって、各種の砲弾を発射することができて、すべての砲弾はすべて1つのプロトコルで、どんな機能がほしいですか、相応の砲弾を持っていればいいです.