質問: self.makeICloudURL(fileName: "test.txt") dispatch_async(dispatch_get_main_queue(), { if icloudURL != nil { self.writeICloud1(icloudURL!) } else { self.showAlert("エラー", text: "iCloudのURLの取得に失敗") } }) } ``` エラー解除の構文を教えて戴けませんか。 スクリーンショットを貼り付けたかったのですが方法がわかりませんでした。
回答: Xcode 9のmigratorはSwift 2の構文は殆どまともに取り扱えないので、大部分を手作業で行われていると言うことなのでしょうか? プロジェクトの規模や内容にもよりますが、 * Xcode 8のmigratorでSwift 2の構文をSwift 3に変換する。 * Xcode 9のmigratorでSwift 3の構文をSwift 4に変換する。 と言う手順を取った方がトータルでは作業が早いことが多いです。諸条件でうまくいかない場合もあるのですが、念のため。 どのような作業手順でここまでたどり着いたのかを書いていただいた方が、より的確なアドバイスを得られることが多いです。 さて、前半のコードと後半のコードを見比べると、 `dispatch_async(`*キューを取得する式*`, {`*クロージャー*`})` ↓ *キューを取得する式*`.async {`*クロージャー*`}` `dispatch_get_global_queue(...)` ↓ `DispatchQueue.global(...)` と言う構造で書き換わっていると言うことにお気づきいただく必要があります。 `dispatch_async`, `dispatch_get_global_queue`、それに`dispatch_get_main_queue`と言ったC言語ベースのGCDインターフェースは、Swift3以降、よりクラスベースっぽいインターフェースに置き換えられていますから、そのパターンは頭に入っていないとSwift2→4の変換を完了させるのは難しいでしょう。 あなたの後半コードでもまだ`dispatch_async`が残っていますから、上記のパターンで書き換えてやらないといけません。また`dispatch_get_main_queue()`は`DispatchQueue.main`に置き換えます。 まとめるとこんな感じになります。 ``` DispatchQueue.global(qos: .default).async { let icloudURL = self.makeICloudURL(fileName: "test.txt") DispatchQueue.main.async { if icloudURL != nil { self.writeICloud1(icloudURL!) } else { self.showAlert("エラー", text: "iCloudのURLの取得に失敗") } } } ``` あなたの後半コードの3行目と8行目: ``` dispatch_async(dispatch_get_main_queue(), { }) ``` が、先ほど書いたパターンに従って、 ``` DispatchQueue.main.async { } ``` 変更されただけ、と言うのがわかるかと思います。 その他にもご苦労されている点などあるかと思いますが、内容的に別件となる場合は、別スレとしてご質問ください。当回答に関してまだわからない点、うまくいかない点などあれば、もちろんコメント等でお知らせくだされば結構です。