日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你應(yīng)該知道的5個Swift組合變換操作符

本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。

10年積累的成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有黔江免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

想隨時隨地輕松變更數(shù)據(jù)格式?本文將教你5種解法!我將在Xcode Playground中創(chuàng)建示例函數(shù),運行它們并觀察結(jié)果。

1. map

.map 操作符允許我們轉(zhuǎn)換閉包中來自發(fā)布者的所有元素。

 
 
 
 
  1. var subscriptions =Set() 
  2.                                             funcmapExample() { 
  3.                           let subject =PassthroughSubject() 
  4.                           subject 
  5.                               .map { (integer) in 
  6.                                   returnString(integer) 
  7.                           } 
  8.                           .sink(receiveValue: { 
  9.                               print("Value: \($0), Type: \(type(of: $0))") 
  10.                           }) 
  11.                           .store(in: &subscriptions) 
  12.                           subject.send(12) 
  13.                           subject.send(31) 
  14.                           subject.send(55) 
  15.                           subject.send(4) 
  16.                           subject.send(18) 
  17.                       } 

下面是這段代碼的作用:

  • 創(chuàng)建一個接受Int 值的PassthroughSubject。
  • 使用.map 操作符將每個接收到的Int 值轉(zhuǎn)換為String。
  • 然后,訂閱發(fā)布者并打印轉(zhuǎn)換后的元素的值和類型。

向受試者發(fā)送隨機(jī)數(shù)以觀察以下結(jié)果:

還有一種巧妙的方法來使用對象的鍵路徑獲取對象的屬性:

 
 
 
 
  1. funcmapKeyPathExample() { 
  2.                         structCarBrand { 
  3.                             let title:String 
  4.                             let country:String 
  5.                         } 
  6.                                let carBrandsSubject =PassthroughSubject() 
  7.                           carBrandsSubject 
  8.                             .map(\.country) 
  9.                             .sink(receiveValue: { country in 
  10.                                 print("Country:\(country)") 
  11.                             }) 
  12.                             .store(in: &subscriptions) 
  13.                                carBrandsSubject.send( 
  14.                             CarBrand(title: "MercedesBenz", country: "Germany") 
  15.                         ) 
  16.                                carBrandsSubject.send( 
  17.                             CarBrand(title: "Ford", country: "USA") 
  18.                         ) 
  19.                                carBrandsSubject.send( 
  20.                             CarBrand(title: "Honda", country: "Japan") 
  21.                         ) 
  22.                     } 

使用.map(\.country),可以訪問CarBrand的國家屬性。然后只需打印每個國家:

2. replaceNil

顧名思義,.replaceNil 操作符將每個接收到的nil元素轉(zhuǎn)換為指定的元素:

 
 
 
 
  1. funcreplaceNilExample() { 
  2.                         let values: [Int?] = [123, nil, nil, 12, 10] 
  3.                         let valuesvaluesPublisher =values.publisher 
  4.                                valuesPublisher 
  5.                             .replaceNil(with: 0) 
  6.                             .map { $0! } 
  7.                             .collect() 
  8.                             .sink(receiveValue: { print($0) }) 
  9.                             .store(in: &subscriptions) 
  10.                     } 

請注意,還可以將多個操作符組合在一起以達(dá)到必要的結(jié)果。首先將每個nil 值替換為0,然后強(qiáng)制解開值,最后將所有值收集在一個數(shù)組中:

需要注意的是在.map 操作符中使用強(qiáng)制展開的方法。如果你不喜歡強(qiáng)行解包該怎么辦?我們還有一個.map協(xié)變量:.compactMap,它能自動轉(zhuǎn)發(fā)僅非零的那些元素:

 
 
 
 
  1. funcreplaceNilExample() { 
  2.                         let values: [Int?] = [123, nil, nil, 12, 10] 
  3.                         let valuesvaluesPublisher = values.publisher 
  4.                                valuesPublisher 
  5.                             .replaceNil(with: 0) 
  6.                             .compactMap { $0 } 
  7.                             .collect() 
  8.                             .sink(receiveValue: { print($0) }) 
  9.                             .store(in: &subscriptions) 
  10.     } 

3. collect

使用.collect操作符可以很容易地收集所有接收到的元素,并發(fā)出一個包含所有元素的數(shù)組:

 
 
 
 
  1. funccollectExample() { 
  2.                      let integers = [1, 4, 5, 12, 24, 44] 
  3.                            let integerPublisher =integers.publisher 
  4.                            integerPublisher 
  5.                          .collect() 
  6.                          .sink(receiveValue: { print($0) }) 
  7.                          .store(in: &subscriptions) 
  8.                  } 

于是我們得到了想要的結(jié)果:

注意,發(fā)布者必須發(fā)出.completed事件才能實現(xiàn)這個操作,因為.collect會一直等待,直到所有元素都發(fā)出并且發(fā)布者完成操作為止。例如,如果使用PassthroughSubject,需要在發(fā)送所有元素后發(fā)送.finished事件:

 
 
 
 
  1. funccollectExample() { 
  2.                      let integerPublisher =PassthroughSubject() 
  3.                            integerPublisher 
  4.                          .collect() 
  5.                          .sink(receiveValue: { print($0) }) 
  6.                          .store(in: &subscriptions) 
  7.                            integerPublisher.send(1) 
  8.                      integerPublisher.send(4) 
  9.                      integerPublisher.send(5) 
  10.                      integerPublisher.send(12) 
  11.                      integerPublisher.send(24) 
  12.                      integerPublisher.send(44) 
  13.                            integerPublisher.send(completion: .finished) 
  14.                  } 

4. flatMap

.flatMap操作符允許我們將給定的發(fā)布者轉(zhuǎn)換為另一個發(fā)布者。來看看它是如何將觀察結(jié)果從Network更改為isAvailable主題:

 
 
 
 
  1. funccollectExample() { 
  2.                      let integerPublisher =PassthroughSubject() 
  3.                            integerPublisher 
  4.                          .collect() 
  5.                          .sink(receiveValue: { print($0) }) 
  6.                          .store(in: &subscriptions) 
  7.                            integerPublisher.send(1) 
  8.                      integerPublisher.send(4) 
  9.                      integerPublisher.send(5) 
  10.                      integerPublisher.send(12) 
  11.                      integerPublisher.send(24) 
  12.                      integerPublisher.send(44) 
  13.                            integerPublisher.send(completion: .finished) 
  14.                  } 

當(dāng)更改它的值時,我們要打印出isAvailable值。首先,它打印初始值(正在使用CurrentValueSubject),一旦為其分配了新值,就會發(fā)生以下情況:

5. scan

.scan操作符能夠在閉包中公開當(dāng)前發(fā)出的值以及最新的值。可以使用它來累積值并打印總結(jié)果:

 
 
 
 
  1. funcflatMapExample() { 
  2.                      structNetwork { 
  3.                          let title:String 
  4.                          let isAvailable =CurrentValueSubject(false) 
  5.                      } 
  6.                            let wifi =Network(title: "Wi-Fi") 
  7.                            let networkSubject = CurrentValueSubject(wifi) 
  8.                            networkSubject 
  9.                          .flatMap ({ 
  10.                              return$0.isAvailable 
  11.                          }) 
  12.                          .sink(receiveValue: { 
  13.                              print("Is networkenabled: \($0)") 
  14.                          }) 
  15.                          .store(in: &subscriptions) 
  16.                            wifi.isAvailable.value=true 
  17.                            wifi.isAvailable.value=false 
  18.                  } 

在這里,執(zhí)行的是以下操作:

  • 創(chuàng)建收益數(shù)組(下劃線是將數(shù)字中的千單位分開的好方法)。
  • 創(chuàng)建這些收益的發(fā)布者。
  • 使用.scan操作符,將當(dāng)前發(fā)出的值($0)添加到從零開始的最新值($1)。

最后,計算出總收益:

【責(zé)任編輯:趙寧寧 TEL:(010)68476606】


新聞標(biāo)題:你應(yīng)該知道的5個Swift組合變換操作符
鏈接分享:http://www.5511xx.com/article/djspico.html