defining protocol
protocol MyProtocol { // define requirements }
adopting protocol
struct MyStruct: Myprotocol {} class MyClass: Myprotocol {}
protocol CanFly {
// protocol 메서드는 body가 없다(= fly메서드 다음에 '{}'가 오지 않는다. 그리고 implementation도 없다.)
func fly()
}
// class Eagle: 옆에 CanFly를 입력해 CanFly protocol의 fly 메서드를 실행시킨다.
class Eagle: Bird, CanFly {
func fly() {
print("The eagle flaps its wings lifts off into the sky.")
}
}
// penguin class는 Canfly protocol이 없어 fly에 대한 능력이 없다.
class Penguin: Bird {
func swim() {
print("The Penguin paddles through the water.")
}
}
// flyingObject에 datatype으로 protocol인 CanFly를 할당한다. 그러면 FlyingMuseum이 flyingDemo 메서드를 실행할 때, CanFly protocol에 있는 메서드 fly를 실행하게 된다. 그러면 FlyingMuseum은 날지 못하는 것을 날게 할 필요가 없다.
struct FlyingMuseum {
func flyingDemo(flyingObject: CanFly) {
}
}
struct Airplane: CanFly {
func() {
func fly() {
print("The airplane uses its engine to lift off into the air.")
}
}
}
let myEagle = Eagle()
let myPenguin = Penguin()
let myPlane = AirPlane
myEagle.fly()
myPlane.fly()
let museum = FlyingMuseum()
// myEagle이 CanFly protocol을 adopt하고 있기 때문에 가능하다.
museum.flyingDemo(flyingObject: myEagle)
UITextField
var = delegate: UITextfieldDelegate delegate.textFieldBegunEditing()
Weather Veiw Controller
WeatherVeiwController: UITextFieldDelegate { let textField = UITextField() textField.delegate = self func textFieldDidBeginEditing() { //do something } }
protocol UITextFieldDelegate { func textFieldDidBeginEditing() }
=> Weather Veiw Controller에서 UITextField를 initialise함
-> textField를 Weather Veiw Controller로 delegate함(이거 무슨 소리지?)
-> UITextField에서 protocol인 UITextFieldDelegate를 통해 이 protocol이 adopt된 Weather Veiw Controller에서 textFieldDidBeginEditing 메서드가 실행된다.