質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2991閲覧

Swift エラー NSURLSession

YUKImidaifucu

総合スコア16

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/12/13 18:07

###前提・実現したいこと
プログラム初心者です。
「swiftではじめる iphoneアプリ開発の教科書 【swift 2&xcode 7対応】」という本のChapter5の「住所検索アプリ」をまずは本を見ながら作ってみています。
しかし、Swift2からSwift3に変わってしまった影響でなのか、本に書かれているコードではエラーが出てしまいます。

エラー解消したいです!
そしてSwift学習のため、できれば正しいコードの書き方も解説していただけるとありがたいです。
よろしくお願いします!

###発生している問題・エラーメッセージ
エラーは同じようなものが2つ出ています。

・'NSURLSession' has been renamed to 'URLSession'
・'NSURLResponse' has been renamed to 'URLResponse'

警告も1つ出ています…
・Expression implicitly coerced from 'NSData?' to Any

###該当のソースコード
import UIKit

class ViewController: UIViewController {
@IBOutlet weak var zipTextField: UITextField!
@IBAction func tapReturn() {
}
@IBAction func tapSearch() {
guard let ziptext = zipTextField.text else {
// 値がnilだったら終了
return
}
// リクエストするURLを作る
let urlStr = "http://api.zipaddress.net/?zipcode=\(ziptext)"

if let url = NSURL(string: urlStr){ // urlオブジェクトがnilでなかったら、検索処理オブジェクトを作る let urlSession = NSURLSession.sharedSession() // 「検索処理が完了したら、onGetAddressを呼び出す」というタスクを作る let task = urlSession.dataTaskWithURL(url, completionHandler: self.onGetAddress) // タスクの実行 task.resume() } } //検索処理が完了したら実行する func onGetAddress(data: NSData?,res: NSURLResponse?, error: NSError?){ //確認のためdataを表示する print(data) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }

}

###試したこと
以下のページを参考に自分なりに書き直してみましたが…、うまくいきませんでした…。
https://blog.areare.net/archives/8321

すみません…
他のページも見てトライしたんですが…どこのページか忘れました…

どうかよろしくお願いします

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode ver : 8.1
USE : Swift3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

赤丸内に白丸はポチポチやってればxcodeが変換してくれます。提示のコードをポチポチやっていくと、urlSession.dataTaskに赤丸「!」がひとつ残ると思います。それに関してはcompletionHandlerがどういう型の引数でなにを返すのかを確認する必要があります。dataTaskをオプション+クリックすると確認、コマンド+クリックで定義に飛びます。このコードではonGetAddressがcompletionHandlerとして指定されているので、このファンクションの型を調べた結果と同じにします。

swift

1 open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask 2

swift

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var zipTextField: UITextField! 5 @IBAction func tapReturn() { 6 } 7 @IBAction func tapSearch() { 8 guard let ziptext = zipTextField.text else { 9 // 値がnilだったら終了 10 return 11 } 12 // リクエストするURLを作る 13 let urlStr = "http://api.zipaddress.net/?zipcode=\(ziptext)" 14 15 if let url = NSURL(string: urlStr){ 16 // urlオブジェクトがnilでなかったら、検索処理オブジェクトを作る 17 let urlSession = URLSession.shared 18 // 「検索処理が完了したら、onGetAddressを呼び出す」というタスクを作る 19 let task = urlSession.dataTask(with: url as URL, completionHandler: self.onGetAddress) 20 // タスクの実行 21 task.resume() 22 } 23 } 24 25 //検索処理が完了したら実行する 26 func onGetAddress(data: Data?,res: URLResponse?, error: Error?){ 27 //確認のためdataを表示する 28 print(data) 29 } 30 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 // Do any additional setup after loading the view, typically from a nib. 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 // Dispose of any resources that can be recreated. 39 } 40} 41

投稿2016/12/13 18:46

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YUKImidaifucu

2016/12/13 19:36

エラー解消できました!!!!!ありがとうございます! そして、こんなにも早く回答していただき、ありがとうございます! 初めてteratailを使用しましたが、このサイトに出会えてよかったです! 今後もお世話になるかもしれませんが、どうぞよろしくお願いします!
SatoshiKomatsu

2017/06/25 10:06

open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask これはどこに反映させればいいのですか?記事を読んだのですがわからなくて質問させていただきました
fromageblanc

2017/06/26 02:11

そこはプログラマが触るところではなく、アップルがapiとして用意(定義)しているものです。なので参照するのみです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問