在 第 18 篇時, 我們使用 Extension
的方式, 將 UITextField 拓展加入 textPublisher, 但畢竟是拓展, 需要額外加入方法, 這次就要使用 IBAction
來套用 Combine.
import UIKit
import Combine
class ViewController: UIViewController {
@IBOutlet var label: UILabel!
@IBOutlet var textField: UITextField!
var set = Set<AnyCancellable>()
@Published var text:String? = "" // 1
override func viewDidLoad() {
super.viewDidLoad()
$text.assign(to: \.text, on: label) // 2
.store(in: &set)
}
@IBAction func didInputChar(_ sender: UITextField) {
text = sender.text // 3
}
}
Published
的 String? 變數乍看之下不是很好懂, 我把他拆開成 CurrentValueSubject
import UIKit
import Combine
class ViewController: UIViewController {
@IBOutlet var label: UILabel!
@IBOutlet var textField: UITextField!
var set = Set<AnyCancellable>()
var textSuject = CurrentValueSubject<String?,Never>("") // 1
override func viewDidLoad() {
super.viewDidLoad()
textSuject.assign(to: \.text, on: label) // 2
.store(in: &set)
}
@IBAction func didInputChar(_ sender: UITextField) {
textSubject.value = sender.text // 3
}
}
還記得嗎? 在第 17 篇時, 我們介紹 Property wrappers
時那神奇的封裝, 在這裡我們嘗試解封裝 @Published
在這次的練習, 我們可以發現
didSet
Property wrappers
的封裝能力很有趣對不對呢?