###前提・実現したいこと
こちらを参考に、こちらのページの15番目のアプリ(swift2で作成)と同じものをswift3で作っているのですが
どうしてもエラーが解決できずに困っています。
教えていただけますと幸いです。
###発生している問題・エラーメッセージ
ボタンを押した時の処理内容にエラーメッセージ「initializer for conditional binding must have Optional type,not 'URL'」が出る
###該当のソースコード
// // ViewController.swift // weather forecast // // Created by on 2017/02/06. // Copyright © 2017年 All rights reserved. // import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! @IBOutlet weak var resultLabel: UILabel! @IBOutlet weak var cityLabel: UILabel! func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() cityLabel.text = textField.text return true } @IBAction func findweather(_ sender: Any) { super.viewDidLoad() var success = false let attemptedUrl = Foundation.URL(string: "http://www.weather-forecast.com/locations/" + textField.text!.replacingOccurrences(of: "", with: "=") + "/forecasts/latest")! if let url = attemptedUrl { ←ここにエラーが出る let session = URLSession.shared let task = session.dataTask(with: url, completionHandler: { (data, response, error) in if let urlContent = data { let webContent = String(data: urlContent, encoding: String.Encoding.utf8) let websiteArray = webContent?.components(separateBy: "3 Day Weather forecast Summary: </b><spanclass = \"read-more-small\"><span class = \"read-more-content\"> <span class = \"class = \"phrase\">") if websiteArray!.count > 1{ let weatherArray = websiteArray[1].components(separatedBy: "</span>") if weatherArray.count > 1 { let weatherSummary = weatherArray[0].replacingOccurrences(of: "°", with: "°") dispatch_async(dispatch_get_main_queue(), { () -> Void in success = true self.resultLabel.text = weatherSummary }) } } } }) task.resume if success == false { self.resultLabel.text = "Sorry, something went wrong." } } } override func viewDidLoad() { } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //キーボードを閉じる self.view.endEditing(true) } }
###試したこと
このサイトから、型宣言をする必要があるとわかったのですがダメでした。
そのほか同じようなアプリを作った人のwebサイト等々色々見てみたのですがいずれも解決できませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0
xcode8.2.1
macOS Sierra(バージョン 10.12)
またその他以下の2点もわからなかったので教えていただけますと幸いです。
①キーボードを閉じる処理上部の'textField.resignFirstResponder()'と下部'self.view.endEditing(true)'は違うのか。なぜ2つもキーボードを閉じる処理を書く必要があるのか
②なぜボタン押した処理のところにsuper.viewDidLoad()を置くのか。なぜ下部override func viewDidLoad()からsuper.viewDidLoad()を除くのか。
これは画面の準備ができたときに同時に、findweatherメソッドの他の処理もするということでしょうか?
もしそうなら、viewDidLoadメソッドの中に書けばいいのではと思ってしまうのですが。
質問が多くて恐縮です。
回答4件
あなたの回答
tips
プレビュー