2016-01-07 7 views
11

मैं WikipediaSearchViewController.swift लाइनों 47-64 से विस्तारRxSwift/RxCocoa से निम्न उदाहरण कोड क्या करता है?

.drive(resultsTableView.rx_itemsWithCellIdentifier("WikipediaSearchCell", 
     cellType: WikipediaSearchCell.self)) 
      { (_, viewModel, cell) in 
       cell.viewModel = viewModel 
      } 

में समझने की कोशिश कर रहा हूँ। मैं (स्ट्रिंग ठोस प्रकार हस्ताक्षर को देखने के लिए तर्क को निकालने के लिए कोशिश की है, लेकिन

let temp1 = searchBar.rx_text 
     .asDriver() 
     .throttle(0.3) 
     .distinctUntilChanged() 
     .flatMapLatest { query in 
      API.getSearchResults(query) 
       .retry(3) 
       .retryOnBecomesReachable([], reachabilityService: ReachabilityService.sharedReachabilityService) 
       .startWith([]) // clears results on new search term 
       .asDriver(onErrorJustReturn: []) 
     } 
     .map { results in 
      results.map(SearchResultViewModel.init) 
    } 

    let driveArg1 = resultsTableView.rx_itemsWithCellIdentifier("WikipediaSearchCell", cellType: WikipediaSearchCell.self) 
    let driveArg2 = { (_, viewModel: SearchResultViewModel, cell: WikipediaSearchCell) in 
     cell.viewModel = viewModel 
    } 
    temp1.drive(driveArg1, curriedArgument: driveArg2) 
     .addDisposableTo(disposeBag) 

करने के लिए एक फिर से लिखने

देता प्रकार का एक तर्क सूची के साथ 'rx_itemsWithCellIdentifier' आह्वान नहीं कर सकता ', cellType: UITableViewCell.Type) '

driveArg1 के लिए

और

अभिव्यक्ति का प्रकार अधिक संदर्भ के बिना संदिग्ध है

driveArg2 के लिए।

drive और rx_itemsWithCellIdentifier के हस्ताक्षर

public func drive<R1, R2>(with: Self -> R1 -> R2, curriedArgument: R1) -> R2 {} 

public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Generator.Element, Cell) -> Void) -> Disposable {} 

हैं, लेकिन इस बिंदु पर स्विफ्ट वाक्य रचना मेरे लिए रफ़ू समझ से बाहर है। क्या कोई हस्ताक्षर समझा सकता है और कोड में क्या होता है?

+0

मैं: यह बस rx_itemsWithCellIdentifier की वापसी प्रकार है, सामान्य भाग के साथ बदल दिया

typealias DriveArg2Type = (source: Observable<[SearchResultViewModel]>) -> (CellConfiguration) -> Disposable 

drive हस्ताक्षर

यह सब विस्तार के साथ, drive के लिए प्रकार हस्ताक्षर उम्मीद है कि अधिक समझ में आता है मैं समझ गया कि किसी प्रकार का सामान्य प्रकार मेल नहीं है। और यह rx_itemsWithCellIdentifier फ़ंक्शन पैरामीटर में सामान्य प्रकार (एस: अनुक्रम प्रकार) का सामान्य प्रकार नहीं लगाया जा सकता है। –

उत्तर

4

यहां, स्विफ्ट कंपाइलर संदर्भ की कमी के कारण driveArg1 और driveArg2 के प्रकार का अनुमान नहीं लगा सकता है। जब drive() कॉल के भीतर इनलाइन का उपयोग किया जाता है, तो संकलक के पास अधिक पैरामीटर होते हैं कि प्रत्येक पैरामीटर का प्रकार क्या हो सकता है, और हम उन प्रकारों के लिए एनोटेट करने की आवश्यकता नहीं रखते हैं।

इसे ध्यान में रखते हुए, उन दो चर के लिए प्रकार एनोटेशन जोड़ने का प्रयास करें।

सबसे पहले, हम तेजी से 2.2 मन में साथ rx_itemsWithCellIdentifier के हस्ताक्षर से अपडेट कर देंगे, भ्रामक currying वाक्य रचना को दूर करने और यह भी सामान्य एनोटेशन

public func rx_itemsWithCellIdentifier 
    <S: SequenceType, Cell: UITableViewCell, O : ObservableType where O.E == S> 
    (cellIdentifier: String, cellType: Cell.Type = Cell.self) 
    -> (source: O) 
    -> (configureCell: (Int, S.Generator.Element, Cell) -> Void) 
    -> Disposable 

driveArg2

प्रकार जोड़ने यह तर्क हम को भेज देते हैं curriedArgumentdrive() पर, और यह तर्क होगा कि हम लागू करने के बाद rx_itemsWithCellIdentifier पर जाते हैं। इस प्रकार, इसे (Int, S.Generator.Element, Cell) -> Void

इस प्रकार की परिभाषा में 0 अज्ञात हैं, S.Generator.Element और Cell। वे सामान्य हैं, इसलिए हमें यह पता लगाने की जरूरत है कि वे क्या हैं।

  • Cell आसान है, यह सेल हम कॉन्फ़िगर करने के लिए, यहाँ WikipediaSearchCell इच्छित प्रकार है।
  • S.Generator.Element थोड़ा कठिन है, लेकिन हम इसे आसानी से समझ सकते हैं। हम O.E == S से प्राप्त करते हैं कि अनुक्रम का प्रकार वह प्रकार है जिसे हम अपने स्रोत तत्व के कोण ब्रैकेट के बीच पाते हैं। हमारे मामले में, स्रोत (temp1) Observable<[SearchResultViewModel]> प्रकार का है।तो S के प्रकार [SearchResultViewModel] इसलिए है, S.Generator.Element हो जाएगा SearchResultViewModel

अच्छा, अब हम है driverArg2 के हस्ताक्षर:

(Int, SearchResultViewModel, WikipediaSearchCell) -> Void 

आगे क्या आता है सरल बनाने के लिए देता है एक typealias के लिए परिभाषित यह

typealias CellConfigurator = (Int, SearchResultViewModel, WikipediaSearchCell) -> Void 

अब हम driveArg2

को परिभाषित कर सकते हैं
let driveArg2: CellConfigurator = { (_, viewModel: SearchResultViewModel, cell: WikipediaSearchCell) in 
    cell.viewModel = viewModel 
} 

driveArg1

प्रकार अब जब कि driveArg2 प्रकार आसान हो जाता है की driveArg1 पता लगाना रास्ते से बाहर है।

drive(Self -> R1 -> R2, curriedArgument: R1) -> R2 
// where 
Self = Observable<[SearchResultViewModel]> 
R1 = CellConfigurator 
R2 = Disposable 
संबंधित मुद्दे