Function Types in Swift

Swift မွာ သေဘာက်သည့္ ေနာက္တစ္ခုကေတာ့ function type ပါ။ အရင္တုန္းကေတာ့ delegate pattern သုံးခဲ့ေပမယ့္ Swift မွာ function type ပါလာသည့္အတြက္ ေၾကာင့္ function ကို variable အေနျဖင့္ သုံးႏိုင္တယ္။ delegate pattern ကေန callback pattern ကို ေျပာင္းၿပီး ေရးလာႏိုင္ပါတယ္။

ဥပမာ setting view ဆိုပါစို႔ ။ ကြၽန္ေတာ္ တို႔ လက္ရွိ view ကေန ေနာက္တဆင့္ ကို ထပ္ဝင္ၿပီးေတာ့ data ကို ေ႐ြးရတယ္။ country လိုမ်ိဳး data ေ႐ြးသည့္ အခါမွာေတာ့ country list view ကို ေျပာင္းသြားတယ္။ country တစ္ခု ကို select လုပ္တယ္။ Delegate တစ္ခု ေၾကျငာၿပီးေတာ့ ျပန္ပို႔တယ္။

Delegate Code Example ေလး ဆိုရင္

let vc = storyboard?.instantiateViewController(withIdentifier: "delegateVC") as? DelegatePatternViewController
vc.delegate = self
self.navigationController?.pushViewController(vc, animated: true)

extension ViewController: MyDelegate {
    func updateSegmentValue(value: String) {
        self.label.text = value  + " FROM DELEGATE"
        

    }
}

DelegatePatternViewController မွာကေတာ့ delegate အတြက္ protocol ခံထားေပးဖို႔ လိုပါတယ္။

import UIKit

protocol MyDelegate {
    func updateSegmentValue(value: String)
}

class DelegatePatternViewController: UIViewController {

    var delegate: MyDelegate?
    
    @IBOutlet var segement: UISegmentedControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        if let callback = self.delegate {
            callback.updateSegmentValue(value: "\(self.segement.selectedSegmentIndex+1)")
        }
    }
  
}

အထက္ပါ code မွာဆိုရင္ view ေပ်ာက္သြားရင္ delegate pattern နဲ႔ သြားေခၚၿပီး result ကို ရႏိုင္ပါတယ္။

protocol ကို ေၾကျငာထားဖို႔ လိုပါတယ္။ ေနာက္တခ်က္က Delegate က ျပန္လာမယ့္ function အတြက္ ထည့္ထားေပးဖို႔ လိုပါတယ္။ ကြၽန္ေတာ္ကေတာ့ လက္ရွိ view controller အစား extension လုပ္ၿပီး ေရးပါတယ္။ code ကို ပိုၿပီး ရွင္းေအာင္ေပါ့။

Function Code Example ေလး ဆိုရင္

let vc = storyboard?.instantiateViewController(withIdentifier: "delegateVC") as? FunctionTypeViewController

vc.updateSegement = { (value:String) -> Void in
                    self.label.text = value + " FROM FUNCTION"
}

self.navigationController?.pushViewController(vc, animated: true)

အခု code မွာေတာ့ ကြၽန္ေတာ္တို႔ေတြ extension ထည့္ထားတာ မပါသလို function ကို တိုက္႐ိုက္ ေရးထားတာ ေတြ႕ႏိုင္ပါတယ္။

import UIKit

class FunctionTypeViewController: UIViewController {

    var updateSegement:((_ value:String) -> Void)?
    @IBOutlet var segement: UISegmentedControl!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        if let callback = self.updateSegement {
            callback("\(self.segement.selectedSegmentIndex+1)")
        }
    }

}

FunctionTypeViewController မွာလည္း protocol မေၾကျငာပဲ updateSegement ဆိုၿပီး function variable ပဲ ေရးထားပါတယ္။

ေနာက္ပိုင္းေတာ့ delegate အစား function type ကို ေျပာင္းေရးျဖစ္တာ မ်ားတယ္။

ေရးရတာ တိုသြားသလို အလုပ္ရႈပ္လည္း ပိုသက္သာတယ္ လို႔ ထင္မိတာေၾကာင့္ပါ။


 
2 Kudos
Don't
move!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.