読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 661 - UIGestureRecognizerState.Changedの実装終了

次のTable Viewのチュートリアルを拡張しています。

yataiblue.hatenablog.com

コード解説を短く区切って申し訳ないです。春先は忙しいんですよ。ゴールデンウィークもバタバタしてます。

case UIGestureRecognizerState.Changed:
   MyCell.cellSnapshot!.center = locationInView.y
   if ((indexPath != nil) && (indexPath != MyCell.initialIndexPath)) {
       swap(&items[indexPath!.row], 
                  &items[MyCell.initialIndexPath!.row])
       simpleTableView.moveRowAtIndexPath(MyCell.initialIndexPath!, 
                                           toIndexPath: indexPath!)
       MyCell.initialIndexPath = indexPath
   }

このコードの後半部分に取りかかります。「indexPath」はロングプレスジェスチャーが発動したcellのindexPathを保持しているはずです。したがって、「indexPath != nil」は常に「True」で、ロングプレスジェスチャーで指を垂直方向に上でも下でも、最初に指をタッチしたcellを動かして上か下のcellを跨ぐと、indexPathとMyCell.initalIndexPathがズレます(indexPath != MyCell.initialIndexPath)。そのような条件の時に「swap」させます。

さて、この「swap」も私にとって初出です。ちょっと調べたら基本的な関数群なんですね。そろそろ中級プログラマーの領域に足を踏み入れているなんて勝手に思っていましたが、私の認識は甘過ぎでした。こういうSwiftの標準ライブラリーのグローバルファンクションを知らないようでは話になりませんね。

それぞれのインデックスパスのrowを入れ替えて移動をさせます。移動した後は再びMyCell.initalIndexPathに設定してやって終了です。

今日はここまで。