2014-06-18 90 views
8

在Objective-C我的動畫位將是這個樣子:animateWithDuration:動畫:完成:在斯威夫特

[UIView animateWithDuration:0.5 animations:^{ 
      [[[_storedCells lastObject] topLayerView] setFrame:CGRectMake(0, 0, swipeableCell.bounds.size.width, swipeableCell.bounds.size.height)]; 
     } completion:^(BOOL finished) { 
      [_storedCells removeLastObject]; 
}]; 

如果我翻譯成雨燕應該是這個樣子:

UIView.animateWithDuration(0.5, animations: { 
        self.storedCells[1].topLayerView.frame = CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height) 
       }, completion: { (finished: Bool) in 
        //self.storedCells.removeAtIndex(1) 
      }) 

它抱怨註釋行。我收到的錯誤是:Could not find an overload for 'animateWithDuration' that accepts the supplied arguments

我知道完成閉包需要一個布爾值並返回一個void,但是我應該能夠寫出一些與bool無關的東西....對吧?

任何幫助表示讚賞。

編輯:這裏是我聲明我正在使用的功能數組:

var storedCells = SwipeableCell[]() 

數組,需要SwipeableCell對象。

+0

你能告訴self.storedCells'的'的聲明和分配。 –

+0

@ 0x7fffffff我更新了我的回答 –

回答

8

這是一個很好的,棘手的!

的問題是在你完成塊...

答:我會通過改寫它像這樣開始:(!不是最終的答案,但對我們的方式存在)

{ _ in self.storedCells.removeAtIndex(1) }

_代替「已完成」Bool,向讀者指示其值未在塊中使用 - 您也可以考慮根據需要添加捕獲列表以防止強參考週期)

B.你寫的閉包有一個返回類型,當它不應該!這一切都歸功於雨燕的方便的功能「從單一的表達關閉隱含的回報」 - 要返回的表達,這是給定的指標

(封閉的參數爲completion類型應該在元素的結果((布爾) - >無效))

這可以解決像這樣:

{ _ in self.storedCells.removeAtIndex(1); return() }

+0

在最後加上'return()',但爲什麼這是必要的? –

+2

Swift有一個功能,它將自動返回僅包含單個表達式的閉包的值,而不必專門使用'return'關鍵字 - 它意味着允許更具可讀性和更簡潔的代碼 - 但在這種情況下,它會讓你失望,因爲方法'removeAtIndex'有一個返回值:它刪除的項目!這是閉包中唯一的表達式,Swift從塊中返回_that_值!然而,塊應該有返回類型'Void' - 所以我們手動返回'()'以符合閉包的類型 – fqdn

+0

空白的return語句等價於return()或return Void,清晰。 – rickster