iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 19

30 天了解 Swift 的 Combine: [19] 使用 @Published 改寫 Day 18

  • 分享至 

  • xImage
  •  

在 第 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
    }
}
  1. 建立一個 Published 的 String? 變數
  2. 將事件流建立
  3. 改變值?

乍看之下不是很好懂, 我把他拆開成 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

  1. 建立一個可以儲存值的 Subject
  2. 建立事件流
  3. 觸發 Subject 的觀察者模式

在這次的練習, 我們可以發現

  1. @Published 很像 didSet
  2. Property wrappers 的封裝能力

很有趣對不對呢?


上一篇
30 天了解 Swift 的 Combine: [18] Custom Publisher for UIKit
下一篇
30 天了解 Swift 的 Combine: [20] Combine 好文分享: Custom publisher in UIControl
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言