40942

[code]

            dispatch_async(dispatch_get_global_queue(
                DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                let icloudURL = self.makeICloudURL("test.txt")
                dispatch_async(dispatch_get_main_queue(), {
                    if icloudURL != nil {
                        self.writeICloud1(icloudURL!)
                    } else {
                        self.showAlert("エラー", text: "iCloudのURLの取得に失敗")
                    }
                })
            })
    
[/code]

上記構文ではエラーになり

下記構文にしていますがエラーが取れない状況です。

[code]

            DispatchQueue.global(qos: .default).async {
                let icloudURL = self.makeICloudURL(fileName: "test.txt")
                  dispatch_async(dispatch_get_main_queue(),  {
                    if icloudURL != nil {
                        self.writeICloud1(icloudURL!)
                    } else {
                        self.showAlert("エラー", text: "iCloudのURLの取得に失敗")
                    }
                })
            }
    
[/code]

エラー解除の構文を教えて戴けませんか。  
スクリーンショットを貼り付けたかったのですが方法がわかりませんでした。


CC BY-SA 3.0
2018-01-14T00:37:37.443
40939
2018-01-14T01:23:52.390
26811
question
swift3 swift4
swift2からswift4へのコンバートエラーについて


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`に置き換えます。

まとめるとこんな感じになります。

[code]

        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の取得に失敗")
                }
            }
        }
    
[/code]

あなたの後半コードの3行目と8行目:

[code]

            dispatch_async(dispatch_get_main_queue(),  {
    
            })
    
[/code]

が、先ほど書いたパターンに従って、

[code]

            DispatchQueue.main.async {
    
            }
    
[/code]

変更されただけ、と言うのがわかるかと思います。

* * *

その他にもご苦労されている点などあるかと思いますが、内容的に別件となる場合は、別スレとしてご質問ください。当回答に関してまだわからない点、うまくいかない点などあれば、もちろんコメント等でお知らせくだされば結構です。


CC BY-SA 3.0
2018-01-14T01:23:52.390
40942
2018-01-14T01:23:52.390
13972
40939
answer