iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1
自我挑戰組

30 天了解 Swift 的 Combine系列 第 3

30 天了解 Swift 的 Combine: [03] 其實你早就在用響應式的概念

上一篇提到響應式的概念, 為了更能理解響應式編程, 這篇將使用 Swift 基本語法來介紹.

面向資料

在 Swift 中, 可以使用 computed variable, 來相對產生資料:


var value:Int = ...

var description: String {"\(value)"}

這個範例中, value是一個可變變數, description 是一個唯讀的變數(非常數).

由於這是比較節約的語法, 拓展之後如下:

var description: String 
{
    get 
    {
        return "\(value)"
    }
}

面向事件

雖然有 computed variable, 可以讓相同物件的屬性之間有相依關係, 但是在實際應用上, 我們常常需要讓不同物件可以共同對事件變化, 這時可以用 didSet 的方式來延伸事件的影響範圍.

var source = 1

var associated = 2 
{
    didSet 
    {
        source = associated
    }
}

或是在函式執行的尾聲, 透過 clousure 的方式延伸事件:

func add(left:Int,
         right:Int,
         onComplete:(Int)->Void) 
{
    let result = left + right
    onComplete(result)
}

add(left: 1, right:2)
{ 
    returnValue:Int in
    print(returnValue)   // 3
}

在我們使用 Combine 之前, 若是需要將 add 的 result 再次執行兩次時, 會這樣處理:

add (left:1, right: 2)
{
    returnValue in
    add(left: returnValue, right: 2) 
    {
        returnValue2 in
        add(left: returnValue2, right: 2) 
        {
            print(returnValue2) // 7
        }
    }
}

而使用 Combine 之後, 則可以改寫為:

import Combine

func add(left:Int,
         right:Int) -> Int
{
    return left + right
}

let aStream:AnyCancellable = 
    Just(1)
    .map{add(left:$0,right:2)}
    .map{add(left:$0,right:2)}
    .map{add(left:$0,right:2)}
    .sink{print($0)} // 7

若是想要減少 add 的次數, 只需要註解或刪除 .map 即可.

簡單測驗:

  1. 如何建立非同步回傳函式? 例如 func getData(from: URL)throws -> (URLResponse, Data)
  2. 如何用圖表表示隨時間變化的事件?

whoami:
我是游諭 ytyubox


上一篇
30 天了解 Swift 的 Combine: [02] 介紹響應式編程
下一篇
30 天了解 Swift 的 Combine: [04] Combine初探, Publisher與 Subscriber
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言