第13部:プロトコルとインクリメンタルゲートウェイモード(復習)

19822 ワード

protocols and extensions


UItextFieldDelegateとはどんなプロトコルですか?マーソンのことです.
プロトコルは、条件が満たされたときに与えられる証明書名です.
protocal MyProtocol {
	//Define requirements
}
struct MyStruct: MyProtocol {}
class MyClass: MyProtocol {}
// 프로토콜은 class와 struct 모두에서 사용이 가능
// 추상메서드만 사용해야하고 상속받는 경우 무조건 구현해야 한다
protocol CanFly {
    func fly()
}

class Bird {
    
    var isFemale = true

    func layEgg() {
        if isFemale {
            print("new bird")
        }
    }

}

// 상속 inheritance
// 상속은 class에서는 되지만 struct에서는 불가능 -> protocol 사용
class Eagle: Bird, CanFly {
    func fly() {
        print("the eagle flaps")
    }
    
    func soar() {
        print("glide")
    }

}

class Penguin: Brid {
    func swim() {
        print("paddle")
    }
}

//비행기와 새들이 날아다니는 박물관
//CanFly 프로토콜을 데이터타입으로 넘김(adopt)
struct FlyingMuseum {
    func flyingDemo(flyingObject: CanFly) {
        flyingObject.fly()
    }    
}

struct  Airplane: CanFly {
    func fly() {
        print("the airplane flys")
    }
}

let myEagle = Eagle()
myEagle.fly()

// 펭귄도 새의 일종이지만 날지 못함
// 상속받고 싶지만 모든 속성이 일치하지 않는 문제 발생
// fly를 CanFly프로토콜에서 사용하고 Bird만 상속받아 문제 해결
let myPenguin = Penguin()
myPenguin.layEgg()
myPenguin.swim()
//myPenguin.fly()

let museum = FlyingMuseum()
let airplane = Airplane()
airplane.fly()
museum.flyingDemo(flyingObject: airplane)
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

The Delegate Design Pattern


デザインモードとは?
A検証された解決策よくある問題の解決策
プロトコルの使用
プロトコルUItextFieldDelegateが採用されているため、textFieldDidBeginEditing()(上のfly()メソッドと同じ)に必要な実装を実装する必要がある
なぜUItextFieldがViewControlを許可するのですか?
問題:

どのクラスがUItextFieldを使っているのか分かりません.
ユーザーがUItextFieldを使用するたびに
どのクラスでも動作を認識できるようにする(UItextFieldの再使用性)
UItextFieldは変更不要
UItextFieldプロトコルのデータ型を宣言します.
依頼(Delegate)(クラスに関係なく).textFieldDidBeginEditing()をトリガすればよい
How does the WeatherViewController actually sign up to be notified by the text field?
ビューコントローラは、テキストフィールドのアラートを受信するためにどのように関与しますか?
解決方法:委託モード
let textField=UItextField()/再利用可能なUIテキストドメインオブジェクトが必要
textField.delegate=self/textFieldのエージェントをviewControllerに設定
ビューコントローラはプロトコルを継承し、方法を実装します.
テキストフィールドでのメソッドの実行

Top Secret:Apple's Code(147講)


UIKET、UItextField、UILable、UIButtonsなどはアップル社のコード(オープンソースではありません)
UItextFieldはどのように依頼と依頼を実現しますか.textFieldDidBeginEditing()がトリガーされるかどうか分かりません.

依頼は、上級LifeSupport(プロトコル)を取得した者のみが所有する
EmergencyCallHandler(textField)は、誰が依頼を持っていてもコマンドを発行することができます.
File> New> Project > macOS > command Line Tool
// CPR 자격증 (프로토콜)
protocol AdvancedLifeSupport {
    func performCPR()
}

class EmergencyCallHandler {
    var delegate: AdvancedLifeSupport?
    
    func assessSituation() {
        print("Can you tell me what happend?")
    }
    
    func medicalEmergency() {
        delegate?.performCPR()
    }
}

struct Paramedic: AdvancedLifeSupport {
    init(handler: EmergencyCallHandler) {
        handler.delegate = self
    }
    
    func performCPR() {
        print("chest compressions")
    }
}

class Doctor: AdvancedLifeSupport {
    init(handler: EmergencyCallHandler) {
        handler.delegate = self
    }
    func performCPR() {
        print("doctors do chest compressions")
    }
    func useStethescope() {
        print("heart sound")
    }
}

class Surgeon: Doctor {
    override func performCPR() {
        super.performCPR()
        print("Sings")
    }
    func useElectricDrill() {
        print("Whirr")
    }
}

let emilio = EmergencyCallHandler()

//let pete = Paramedic(handler: emilio)
let angela = Surgeon(handler: emilio)
// pete인지 angela인지 상관없이 emilio가 하는 일은 동일하다

emilio.assessSituation()
emilio.medicalEmergency()

Swift extensions


extend the function:機能の追加
列車路線の延長に似ている
機能を追加するタイプの実装済みソースコードが分からないか、見えない場合は、そのタイプの機能を拡張することもできます.
import UIKit

extension UIButton {
    func makeCircular() {
        self.clipsToBounds = true
        self.layer.cornerRadius = self.frame.size.width / 2
    }
}

let button = UIButton(frame: CGRect(x: 0, y:0, width: 50, height: 50))
button.backgroundColor = .red

button.makeCircular()

class、protocol、extensionの違いは何ですか?


  • classはclassデータ型のみを継承できます.
    プロトコルと拡張により、すべてのデータ型が継承されます.

  • classは継承後に再定義できますが(垂直)、拡張は継承後に再定義できません(水平)
    サンプルDoubleタイプ
    では、Doubleタイプの採用と遵守が必要な多くのプロトコルはどこに行ったのでしょうか.どこで採用し、どこで遵守しますか?
    答えはもちろんExtension
    ほとんどのスイッチ標準ライブラリタイプの機能は、拡張によって実現されます.

  • プロトコルが継承後に実装されなければならない場合は、カッコのinitが含まれていないためです.
    拡張は初期化できます.
  • Adoptiong Protocols


    ビューコントローラは、複数のプロトコルを継承します.
    各プロトコルを別々に継承し、拡張することで、コントローラをきれいに使用できます.
    extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 {
        // 프로토콜 요구사항 구현
    }