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 ကို ပြောင်းရေးဖြစ်တာ များတယ်။
ရေးရတာ တိုသွားသလို အလုပ်ရှုပ်လည်း ပိုသက်သာတယ် လို့ ထင်မိတာကြောင့်ပါ။
Leave a Reply