2017-04-25 38 views
0

我正試圖在Objective-C中隱藏Speakrbox代碼。 我已經轉換的大部分代碼,但是我有一個小問題,這一個:從Swift到Objective C - updateCallDurationForVisibleCells

private func updateCallDurationForVisibleCells() { 
    /* 
     Modify all the visible cells directly, since -[UITableView reloadData] resets a lot 
     of things on the table view like selection & editing states 
    */ 
    let visibleCells = tableView.visibleCells as! [CallSummaryTableViewCell] 

    guard let indexPathsForVisibleRows = tableView.indexPathsForVisibleRows else { return } 

    for index in 0..<visibleCells.count { 
     let cell = visibleCells[index] 
     let indexPath = indexPathsForVisibleRows[index] 

     guard let call = call(at: indexPath) else { return } 
     cell.durationLabel?.text = durationLabelText(forCall: call) 
    } 
} 

我試着將它轉換,這裏是我:

-(void) updateCallDurationForVisibleCells :(id)sender { 
    /* 
    Modify all the visible cells directly, since -[UITableView reloadData] resets a lot 
    of things on the table view like selection & editing states 
    */ 

    _visibleCells = _tableview.visibleCells; 

    if(_indexPathsForVisibleRows == _tableview.indexPathsForVisibleRows) { return ; } 
    int index; 
    for (index=0; index<_visibleCells.count; index ++) 
    { 
     UICollectionViewCell *cell = _visibleCells[index]; 
     NSIndexPath *indexPath = _indexPathsForVisibleRows[index]; 
     UITableViewCell* call; 

     if((call = [self.tableView cellForRowAtIndexPath:indexPath])) 
      { return ; } 

    } 
} 

可以在任何一個請幫我把這個Swift代碼轉換成Objective-C?該代碼不編譯的原因,我不知道怎麼這行代碼轉換:

cell.durationLabel?.text = durationLabelText(forCall: call) 

另外,我不知道我是否以正確的方式做到了,尤其是轉換guard let

,你會發現這裏呼叫和durationLabelText功能,我在pdateCallDurationForVisibleCells功能已經使用:

private func call(at indexPath: IndexPath) -> SpeakerboxCall? { 
    return callManager?.calls[indexPath.row] 
}//swift 


private func durationLabelText(forCall call: SpeakerboxCall) -> String? { 
    return call.hasConnected ? callDurationFormatter.format(timeInterval: call.duration) : nil 
}//Swift 
+0

請[編輯]你的問題,並清楚地解釋發出您有用你發佈的代碼。 – rmaddy

+0

你不明白如何工作'警衛let':'if(_indexPathsForVisibleRows == _tableview.indexPathsForVisibleRows){return; }'=>'if(!_tableview.indexPathsForVisibleRows){return;}'對於'guard let call = call(at:indexPath)else {return}',我不知道'call'是什麼。 – Larme

+0

@Rmaddy我試圖將一個快捷方法轉換爲目標c,第一個代碼是在swift中,第二個是我已經實現它的結果比swift快的那個objectivec代碼 – khouloud

回答

0

這裏是你的Objective-C代碼搞掂版本。請注意,當您在Swift中看到varlet時,您正在創建一個局部變量。當你只應用局部變量時,不要在Objective-C代碼中創建一堆不必要的實例變量或屬性。

- (void)updateCallDurationForVisibleCells { 
    /* 
    Modify all the visible cells directly, since -[UITableView reloadData] resets a lot 
    of things on the table view like selection & editing states 
    */ 

    NSArray *indexPathsForVisibleRows = self.tableView.indexPathsForVisibleRows; 
    if(!indexPathsForVisibleRows) { return ; } 

    NSArray *visibleCells = self.tableview.visibleCells; 

    for (NSInteger index = 0; index < _visibleCells.count; index++) { 
     CallSummaryTableViewCell *cell = visibleCells[index]; 
     NSIndexPath *indexPath = indexPathsForVisibleRows[index]; 

     SomeDataType *call = [self call:indexPath]; 
     if (!call) { return; } 

     cell.durationLabel.text = [self durationLabelText:call]; 
    } 
} 

有一些信息丟失,這意味着此轉換可能不是100%正確的。

  1. 你沒有表現出call:方法的Objective-C的簽名,所以我不能確定如何正確地調用它,我不知道是幹什麼用的數據類型爲call變量。用適當的類型替換SomeDataType
  2. 您尚未顯示durationLabelText:方法的Objective-C簽名,所以我無法100%確定要調用它的正確方法。

如果你在你的問題中發佈這些細節,我可以肯定這個答案已經正確更新。

+0

感謝您的回答,我修改了問題,並添加了durationLabelText:和call:methods – khouloud

+0

您需要添加這些方法的Objective-C,而不是Swift版本。 – rmaddy

+0

我想將它們轉換,這就是爲什麼我添加了快捷版本 – khouloud

0

編輯:感謝像@rmaddy這樣的用戶,像我這樣的新手學習如何編寫答案。添加最終的完整代碼部分。

跳到答案的最後部分以獲取工作代碼。 如果你想知道你出錯的地方,請閱讀完整的答案。

有多種事情是可能不是在這裏,讓我解決我所知道的:

  1. 防護語句用於正常退出。我不是Java專家,但認爲這與Java中的Exceptions類似。您的第一個後衛與obj-C代碼將是:

    if (nil == _tableview.indexPathsForVisibleRows){ 
        return 
    } 
    

    這也意味着,有沒有必要爲_indexPathsForVisibleRows變量。

    我推薦這篇文章,以瞭解後衛更好: https://ericcerney.com/swift-guard-statement/

  2. 關於你的第二個後衛,請注意細節。 致電(at:indexPath)與cellForRowAtIndexPath不一樣。 調用(at:indexPath)是一個返回數據類型(比如CallType)的類函數。 cellForRowAtIndexPath是一個UITableView函數,它返回一個單元格。

  3. 在下面的行中的細胞更可能是類型的CallSummaryTableViewCell

    UICollectionViewCell *cell = _visibleCells[index]; 
    
  4. 關於durationLabelText(),它似乎是在迅速的文件,其聲明將是這樣一類函數:

    //Assume the type of "call" is CallType 
    private func durationLabelText(forCall call : CallType) -> String{ 
    //your code here 
    } 
    

    Objective-C的等效將是:

    -(NSString*) durationLabelTextForCall: (id<CallType>) call{ 
    //your code here 
    } 
    

    Objective-C的電話是:

    cell.durationLabel.text = [self durationLabelTextForCall: call] 
    

所以,最終代碼會是這樣:

-(NSString*) durationLabelTextForCall: (id<CallType>) call{ 
//your code here 
} 

-(id<CallType>) callAtIndexPath:(NSIndexPath) indexPath{ 
//your code here 
} 

- (void)updateCallDurationForVisibleCells { 
    /* 
    Modify all the visible cells directly, since -[UITableView reloadData] resets a lot 
    of things on the table view like selection & editing states 
    */ 
    if (nil == _tableview.indexPathsForVisibleRows){ 
     return 
    } 

    NSArray *visibleCells = self.tableview.visibleCells; 

    for (index=0; index<visibleCells.count; index ++) 
    { 
     CallSummaryTableViewCell *cell = visibleCells[index]; 
     NSIndexPath *indexPath = _tableview.indexPathsForVisibleRows[index]; 

     id<CallType> call = [self callAtIndexPath:indexPath]; 
     if (nil == call){ 
      return 
     } 
     cell.durationLabel.text = [self durationLabelTextForCall: call]  
    } 
} 
+0

進行工作您在回答中提到了Java,但問題與Swift和Objective-C有關。 – rmaddy

+0

嗨@rmaddy,我想把JAVA例外作爲一個類比來保護。我想我也可以在Swift中聲明Asserts,但不是那麼強大..我會編輯我的答案來說「在JAVA中的異常」 – 7to4