μ΄ κΈμ Bob the Developer μ Protocol Oriented Programming View in Swift3 μ λν λ²μμ λλ€.
λ§μ ν΄λμ€λ₯Ό λ§λ€μ§ μμΌλ©΄μ button, label, imageView λ€μ μ΄μ μμ§μ΄κ² νλ(animate) λ°©λ²μ λ°°μλλ€.
POPλ₯Ό λ°°μ°λ κ²μ λ°±κ³Όμ¬μ /λΈλ‘κ·Έμμ 보물μ μ°Ύλ κ²κ³Ό κ°μ΅λλ€.2017λ 3μ 20μΌ μ΅μ’ κ°±μ λ¨.
μ€μ²μ΄ μλ μ§μμ μ΄λΉ¨μ΄ μμ§λ§ μ°μ λ§ λ§μλ κ²κ³Ό κ°λ€λ λ§μ λ€μ΄ 보μ
¨μ κ²λλ€.
μ¬λ¬λΆμ "μ’μ΅λλ€. μ΄λ‘ μ μΆ©λΆν©λλ€. μ±μμ μ΄λ»κ² POPλ₯Ό μμν μ μμ£ ?" π€ λΌκ³ λ¬ΌμΌμ€ κ²λλ€.
μ λ μ¬λ¬λΆμ΄ Completion Handlers λ₯Ό μΆ©λΆν μ΄ν΄νκ³ μμΌλ©°, Protocol μ μ΄μ©ν΄μ κΈ°μ΄μ μΈ κ΅¬νμ νμ€ μ μλ€κ³ κ°μ ν©λλ€. Β λ§μ½ μ΄λ° κ²λ€κ³Ό μΉμνμ§ μμΌμλ€λ©΄, μλμ μ μ κΈλ€κ³Ό λμμλ€μ λ³΄κ³ μ€μκΈ°λ₯Ό μ μ€ν μμ²λ립λλ€.
μ¬μ νμ μ¬ν:
Clojure κ±±μ μμ΄μ ννΈ 2:Completion Handlers (Medium)
Protocol Oriented Programming μ λν μκ°(Medium)
Protocol Oriented Protocol μλ¦¬μ¦ (YouTube )
μ¬λ¬λΆμ UIButton, UILabel κ·Έλ¦¬κ³ UIImageView μ κ°μ UI μ»΄ν¬λνΈλ€μ μ΄μ μμ§μ΄κ² νκΈ°(animate) μν΄μ Protocol μ μ¬μ©νλ λ°©λ²μ λ°°μΈ κ²λλ€. μ λ μ ν΅μ μΈ λ°©λ²λ€ κ³Ό POP λ°©μμ μ°¨μ΄μ μ 보μ¬λ릴 κ²λλ€.
demo μ±μ "μ°λ¦¬ μ§ νν°μ μ€μ κ±Έ νμν©λλ€."("Welcome to My House Party")λΌκ³ λΆλ¦½λλ€. μ λ μ΄μ±μ μ κ° μ¬λ¬λΆμ μ ν¬ μ§ νν°μ μ΄λνλμ§ μλμ§λ₯Ό νμΈνκΈ° μν΄μ μ΄ μ±μ λ§λ€μμ΅λλ€. μ¬λ¬λΆμ μ΄λ μ½λλ₯Ό μ λ ₯νμ μΌ ν©λλ€. μ΄ μ±μλ λ‘μ§μ΄ μμ΅λλ€. λ§μ½ μ¬λ¬λΆμ΄ λ²νΌμ λλ₯΄μ λ€λ©΄, κ·ΈλΌμλ λΆκ΅¬νκ³ μ΄μ μμ§μΌ(animate) κ²μ λλ€. μμ§μ΄λ 4κ°μ μ»΄ν¬λνΈκ° μμ΅λλ€. passcodeTextField, loginButton, errorMessageLabel κ·Έλ¦¬κ³ profileImageView.
λκ°μ§ μ λλ©μ΄μ μ΄ μμ΅λλ€.: 1.λΉ λ₯΄κ² μ§λνκΈ°(Buzzing) 2.νμ΄λμ€κΈ°(Poping(Flash))
μμ±λ νλ‘μ νΈλ΄λ € λλ κ²μ λν΄μ κ±±μ νμ§ λ§μΈμ. λΉμ₯ μ μ ν¨κ» κ·Έλ₯ λ¬Όμ²λΌ νλ₯΄μΈμ. λ§μ½ μ¬λ¬λΆμ΄ μ°Έμμ±μ΄ μμΌμλ€λ©΄, κ·Έλ₯ μ€ν¬λ‘€νκ³ μμ€ μ½λλ₯Ό λ€μ΄λ‘λ λ°μΌμκ³ κ·Έλ₯ 무μνμ€ μλ μμ΅λλ€.
μ€μ μ±μμμ POPμ νμ μμ ν νμ νκΈ° μν΄μ, μ ν΅μ μΈ λ°©λ²κ³Ό λΉκ΅ν΄λ΄ μλ€. μ¬λ¬λΆμ΄ UIButton κ³Ό UILabel μ μ΄μ μμ§νκ²(animate) νκ³ μΆλ€κ³ ν©μλ€. λ ν΄λμ€λ₯Ό μμνκ³ κ·Έκ²μ λ©μλλ₯Ό μΆκ°ν μλ μμ κ²λλ€.
class BuzzableButton: UIButton {
func buzz() { // Animation Logic }
}
class BuzzableLabel: UIButton {
func buzz() { // Animation Logic }
}
κ·ΈλΌ, λ‘κ·ΈμΈ λ²νΌμ νν λ μ§λνκ²("buzz") ν©μλ€.
@IBOutlet wear var errorMessageLabel: BuzzableButton!
@IBOutlet wear var loginButton: BuzzableLabel!
@IBAction func didTapLoginButton(_ sender: UIButton) {
errorMessageLabel.buzz()
loginButton.buzz()
}
μ°λ¦¬κ° λ°λ³΅νκ³ μλ κ²μ μ μ μμΌμ κ°μ? μ λλ©μ΄μ λ‘μ§μ μ΅μν 5μ€μ λλ€. κ·Έλ¦¬κ³ extension μ μ΄μ©νλ "λ λμ" λ°©λ²μ΄ μμ΅λλ€. UILabel κ³Ό UIButton μ UIView μ μνκΈ° λλ¬Έμ, λ€μμ μΆκ°ν μ μμ΅λλ€.
extension UIView {
func buzz() { // Animation Logic }
}
κ·Έλμ, BuzzableButton κ³Ό BuzzableLabel λ buzz λ₯Ό ν¬ν¨ν©λλ€. μ΄μ , μ°λ¦¬λ λμ΄μ λ°λ³΅νμ§ μμλ λ©λλ€.
class BuzzableButton: UIButton {}
class BuzzableLabel: UIButton {}
@IBOutlet wear var errorMessageLabel: BuzzableButton!
@IBOutlet wear var loginButton: BuzzableLabel!
@IBAction func didTapLoginButton(_ sender: UIButton) {
errorMessageLabel.buzz()
loginButton.buzz()
}
λ³΄μ ¨λ κ²κ³Ό κ°μ΄, "μ ν¨ν μ½λλ₯Ό μ λ ₯ν΄μ£ΌμΈμ"("Please enter valid code π") λΌκ³ λ§νλ errorMessageLabel μ λν μ λλ©μ΄μ μ΄ νκ°μ§ λ μμ΅λλ€. λνλ¬λ€κ° μ¬λΌμ§λλ€. κ·Έλμ μ ν΅μ μΈ λ°©λ²μΌλ‘λ μ΄λ»κ² νλμ?
μ΄κ²μ λν΄μλ λκ°μ§ λ°©λ²μ΄ μμ΅λλ€. λ¨Όμ , λ€μ UIView μ λ€λ₯Έ λ©μλλ₯Ό μΆκ°ν΄ μ£ΌμΈμ.
// Extend UIView
extension UIView {
func buzz() { // Animation Logic }
func pop() { // UILabel Animation Logic }
}
νμ§λ§, λ§μ½ UIViewμ λ©μλλ₯Ό μΆκ°νλ©΄, pop λ©μλκ° UILabel λ₯Ό ν¬ν¨ν λ€λ₯Έ UIComponentλ€μλ κ°λ₯νκ² λ κ²λλ€. λΆνμν ν¨μλ₯Ό μμνκ² λ©λλ€. κ·Έλ¦¬κ³ UIComponentλ€μ΄ κΈ°λ³Έμ μΌλ‘ λΉλν΄μ§λλ€.
λλ²μ§Έ λ°©λ²μ UILabel μ μμ(Subclass)νλ κ²λλ€.
// Subclass UILabel
class BuzzableLabel: UILabel {
func pop() { // UILabel Animation Logic }
}
μ μλν©λλ€. νμ§λ§, μ΄λ¦μ 보λ κ²λ§μΌλ‘λ μ΄λ€ ν΄λμ€μΈμ§ μμ μλλ‘, class μ΄λ¦μ BuzzablePoppableLabel λ‘ λ°κΎΈκ³ μΆμ μ μμ΅λλ€.
μ΄μ , labelμ΄ λ¬΄μμ νλμ§ λͺ νν νκΈ° μν΄μ UILabel μ λ©μλλ₯Ό νλ λ μΆκ° νκ³ μΆλ€λ©΄, class μ΄λ¦μ BuzzablePoppableFlashableDopeFancyLovelyLabel κ°μ κ²μΌλ‘ λ³κ²½ν΄μΌ ν μ§λ λͺ¨λ₯΄κ² μ΅λλ€. μ΄κ² μ§μ κ°λ₯ν λ°©λ²μ΄ μλλλ€. λ¬Όλ‘ , λ무 λ©λ¦¬ κ°κΈ΄ νμ΅λλ€.
μ’μ΅λλ€. μμ(subclassing)μ μΆ©λΆν©λλ€. Protocol λΆν° λ§λ€μ΄ λ΄ μλ€. λΉ λ₯΄κ² μ§λνκΈ°(Buzzing) λ¨Όμ .
μ λλ©μ΄μ μ μν μ½λλ μΎ κΈΈκ³ λͺ¨λ°μΌ μ±μμ μ μ²μ μΌλ‘ μ§μλλ κ²μ΄ μλκΈ° λλ¬Έμ λ£μ§ μμμ΅λλ€.
protocol Buzzable {}
extension Buzzable where Self: UIView {
func buzz() { // Animation Logic}
}
κ·ΈλΌ μ΄μ , Buzzable protocolμ μ€μνλ(conform) UIComponentλ€μ μ°κ΄λ buzz λ©μλλ₯Ό κ°μ§κ² λ κ²λλ€. extension κ³Ό λ€λ₯΄κ²(extension UIView λ‘ λ©μλλ₯Ό μΆκ°νλ κ²κ³Όλ λ€λ₯΄κ²) μ΄ protocolμ μ€μνλ(conform) κ²λ€λ§ μ΄ λ©μλλ₯Ό κ°μ§κ² λ κ²λλ€. λν, where Self: UIView λ μ΄ protocol μ΄ <'UIView λ‘ λΆν° μμλ μ»΄ν¬λνΈ' νΉμ 'UIView'>μ λν΄μλ§ μ€μλμ΄μΌ(conformed)νλ€λ κ²μ λνλ΄κΈ° μν΄μ μ¬μ©ν©λλ€.
μ, κ·Έκ²λλ€. Buzzable μ loginButton, passcodeTextField, errorMessageLabel κ·Έλ¦¬κ³ profileImageView μ μ μ©ν©μλ€. νμ§λ§, μ μλ§ κΈ°λ€λ¦¬μΈμ. Poppableμ μ΄λ€κ°μ?
λ€, λκ°μ΅λλ€.
protocol Poppable {}
extension Poppable where Self: UIView {
func pop() { // Pop Animation Logic }
}
μ΄μ νμ€λ‘ λ§λ€ μκ°μ λλ€.
class BuzzableTextField: UITextField, Buzzable {}
class BuzzableButton: UIButton, Buzzable {}
class BuzzableImageView: UIImageView, Buzzable {}
class BuzzablePoppableLabel: UILabel, Buzzable, Poppable {}
class LoginViewController: UIViewController {
@IBOutlet weak var passcodTextField: BuzzableTextField!
@IBOutlet weak var loginButton: BuzzableButton!
@IBOutlet weak var errorMessageLabel: BuzzablePoppableLabel!
@IBOutlet weak var profileImageView: BuzzableImageView!
@IBAction func didTabLoginButton(_ sender: UIButton) {
passcodTextField.buzz()
loginButton.buzz()
errorMessageLabel.buzz()
errorMessageLabel.pop()
profileImageView.buzz()
}
}
POPμμ μ’μ μ μ μμ μμ΄λ λ€λ₯Έ UIComponentμ pop μ μΆκ°ν μ μλ€λ μ μ λλ€.
class MyImageView: UIImageVIew, Buzzable, Poppable
μ΄μ , μ€μνλ protocolλ€μ κΈ°λ°ν κ°λ₯ν λ©μλλ€κ³Ό ν΄λμ€λ₯Ό μ€λͺ νλ κ°κ°μ protocol μ μ΄λ¦μ μ΄λ―Έ μκΈ° λλ¬Έμ, class μ΄λ¦μ΄ μ’ λ μ μ°ν΄μ§ μ μμ΅λλ€.
λμ΄μ νμμλ μμ(Subclass)
μ μ°ν ν΄λμ€ μ΄λ¦
Swift κ°λ°μλ‘μ λ°λΌ μ‘μ λλ.
μ΄ κΈμ΄ 200κ°μ μ’μμλ₯Ό λ°κ³ μ¬λ¬λΆμ΄ POPλ₯Ό UITableView μ UICollectionViewμ μ μ©νλ λ°©λ²μ λ°°μ°κΈ°λ₯Ό μνμ λ€λ©΄, Mediumμμ μ λ₯Ό νλ‘μ°ν΄μ£ΌμΈμ!
μ¬λ¬λΆμ΄ λκ° μλ‘μ΄ κ²μ λ°°μ°μ ¨κΈ°λ₯Ό λ°λλλ€. κ·Έλ λ€λ©΄, κΈμ μ νμλ‘ β€οΈ λ₯Ό νν΄μ£ΌμΈμ. μ΄ κ΅¬νμ΄ μ μ©νμ ¨λ€λ©΄, μ μΈκ³μ iOS κ°λ°μλ€μ΄ Protocol Oriented View λ€μ νλλ‘ κ³΅μ ν΄μ£ΌμΈμ. Protocol Oriented View λ€μ μ½λλ₯Ό λ κ°κ²°νκ² νλ©΄μ, λͺ¨λν ν μ μκ² ν©λλ€. ν μμΌ λ°€ 8μ(λ―Έκ΅ λλΆ νμ€μ)μ λ€μ λ΄μ! λ λ§μ΄ λ°°μ°κ³ μΆκ³ , λ λ§μ΄ λ°κ³ μΆμΌμλ€λ©΄, μ¬κΈ° μ μ λ©μΌλ§ 리μ€νΈμ κ°μ νμΈμ.
iOS κ°λ°μλ₯Ό μν μλ£ νμ΄μ§
κ°μ¬ν©λλ€.

