質問: self.webString //webStringにテキストファイルの中身が代入されておらず、textViewには初期値の「default」が表示される。 } ```
回答: 代入できていないのではなくて、実行される順番を勘違いされています。。 `NSURLSession`のメソッドは非同期で実行されます。ネットワーク通信は時間がかかるため、その間、操作をブロックしてしまうわけにはいかないからです。 なので、このコードの実行順序は、下記のように、`NSURLSession.resume()`メソッドは通信の完了を待たずに終了し、すぐにその下の`self.textView.text = self.webString`の行が実行されます。これが`textView.text`にデフォルトの値が入ってしまう理由です。 ``` // 1. let textUrl = NSURL(string: urlString) // 2. ただし、クロージャの中の処理はまだ実行されない NSURLSession.sharedSession().dataTaskWithURL(textUrl!) { (data, response, error) -> Void in // 4. 通信が完了した時点でクロージャが呼び出される self.webString = String(data: data!, encoding: NSUTF8StringEncoding)! print(self.webString) //この時点ではwebStringにテキストファイルの中身が代入されており、きちんとログ出力される。 }.resume() // 3. 通信が開始する前に、2のメソッドを抜けて、この行が先に実行される self.textView.text = self.webString ``` 通信の結果を`textView.text`に代入するにはコールバックとしてのクロージャが呼ばれた後で行う必要があります。クロージャの中でやるのが簡単です。 気をつける点としては、クロージャはバックグラウンドスレッドで呼ばれることがありますので、UIの更新(textView.textへの代入)はメインスレッドにディスパッチする必要があります。 ``` let textUrl = NSURL(string: urlString) NSURLSession.sharedSession().dataTaskWithURL(textUrl!) { (data, response, error) -> Void in self.webString = String(data: data!, encoding: NSUTF8StringEncoding)! dispatch_async(dispatch_get_main_queue()) { self.textView.text = self.webString }; }.resume() ``` 期待した動作になるように書き直すと上記のようになると思います。