iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 11

30 天了解 Swift 的 Combine: [11] Operator 3.整併類型 + 4.符合篩選類型 + 5.序列篩選類型

  • 分享至 

  • xImage
  •  

Operator 3. 整併類型

3-1. reduce: 將上游在結束前的每個元素連續處理


func reduce<T>(_ initialResult: T,
               _ nextPartialResult: @escaping (T, Self.Output) -> T) -> Publishers.Reduce<Self, T>



/******demo code*******/
 _ = [1,2,3,4,5].publisher
            .reduce(0, +)
            .sink{print("get value:", $0)}
/******console*********/

get value: 15

/*******Rarbles********/

---1---2---3---4---5---|

      reduce(0,+)

------------------------15--|

3-2. collect: 將上游的元素, 用固定的方式搜集, 搜集到一定的程度會轉發至下游.


func collect(_ count: Int) -> Publishers.CollectByCount<Self>

/******demo code*******/
  _ = [1,2,3,4,5].publisher
        .collect(3)
            .sink{print("get value:", $0)}
            
/******console*********/

get value: [1, 2, 3]
get value: [4, 5]

/*******Rarbles********/

---1---2---3---4---5---|

    .collect(3)

-----------[1,2,3]-----[4,5]--|

Operator 4. 符合篩選類型

這系列的 Operator 很像 isSOME:Bool

4-1. allSatisfy: 將所有上游的元素用一定的標準判断, 會在任一不通過元素直接轉發 False

func allSatisfy(_ predicate: @escaping (Self.Output) -> Bool) -> Publishers.AllSatisfy<Self>

/******demo code*******/

_ = (1...5).publisher
    .allSatisfy{$0 > 0}
    .print()
    .sink{print("get value:", $0)}
            
/******console*********/
    
receive subscription: (Once)
request unlimited
receive value: (true)
get value: true
receive finished

/*******Rarbles********/

---1---2---3---4---5---|

    allSatisfy{$0 > 0}
    
-----------------------T--|

Operator 5. 序列篩選類型

將這類的 Operator 想成 Sequence,會好一些。

5-1. first: 將上游的第一個元素轉發,並立即發布結束。

func first() -> Publishers.First<Self>

/******demo code*******/

  _ = (1...5).publisher
        .first()
        .print()
          .sink{print("get value:", $0)}
            
/******console*********/

receive subscription: (Optional)
request unlimited
receive value: (1)
get value: 1
receive finished

/*******Rarbles********/

---1---2---3---4---5---|

    .first()

---1---|

5-2. last: 將上游的最新元素保留,並攔截發布,當上游發布結束時,將保留的元素發布,並立即結束。



/******demo code*******/

  _ = (1...5).publisher
           .last()
             .sink{print("get value:", $0)}
            
/******console*********/

get value: 5

/*******Rarbles********/

---1---2---3---4---5---|

    .first()

-----------------------5---|

             

5-3. drop: 跟 filter 很不同,邏輯相反且部分套用。

/*
func drop(untilOutputFrom:)


/******demo code*******/

 _ = (0...5).publisher
            .drop{$0.isMultiple(of: 2)}
            .sink{print("get value:", $0)}
             
/******console*********/

get value: 1
get value: 2
get value: 3
get value: 4
get value: 5

/*******Rarbles********/

---0---1---2---3---4---5---|

drop($0.isMultiple(of: 2))

-------1---2---3---4---5---| 

5-4. append: 在上游發布結束時,將預定好的元素發布,再轉發結束。


func append<S>(_ elements: S) -> Publishers.Concatenate<Self, Publishers.Sequence<S, Self.Failure>> where S : Sequence, Self.Output == S.Element

/******demo code*******/

 _ = (0...2).publisher
        .append(3, 4, 5)
          .sink{print("get value:", $0)}
          
/******console*********/

get value: 0
get value: 1
get value: 2
get value: 3
get value: 4
get value: 5

/*******Rarbles********/

---1---2---|

append(3, 4, 5)
           ---3---4---5---|
           
---0---1---2---3---4---5---|

  

5-5. prepend:在上游發布第一個元素,攔截並發布預定好的元素,完成之後再持續轉發上游的元素(含第一個)。


func prepend(_ elements: Self.Output...) -> Publishers.Concatenate<Publishers.Sequence<[Self.Output], Self.Failure>, Self>

/******demo code*******/

  _ = (3...5).publisher
        .prepend(1, 2)
          .sink{print("get value:", $0)}

/******console*********/

get value: 1
get value: 2
get value: 3
get value: 4
get value: 5

/*******Rarbles********/

---3---4---5---|

  prepend(1, 2)
  ---1---2---|
  
---0---1---2------3---4---5---|
  

上一篇
30 天了解 Swift 的 Combine: [10] Operator 2: 一般篩選類型
下一篇
30 天了解 Swift 的 Combine: [12] Operator 6. 上流整合類型
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言