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

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

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

Q&A

解決済

3回答

2104閲覧

swift初心者。エラーが出て進めません。誰か助けてください。お願いします。

animal_anny

総合スコア4

0グッド

0クリップ

投稿2021/05/01 07:23

編集2021/05/01 13:02

前提・実現したいこと

swift初心者です。youtubeを見ながらNewsAppを作っていたのですが、エラーが出て進めません。

発生している問題・エラーメッセージ

Cannot find 'getData' in scope The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions Cannot find 'ContentView' in scope Contextual closure type '(Data?, URLResponse?, Error?) -> Void' expects 3 arguments, but 2 were used in closure body Consecutive statements on a line must be separated by ';'

該当のソースコード

import SwiftUI import SwiftyJSON import SDWebImageSwiftUI struct CotentView: View { @ObservedObject var list = getData() var body: some View { NavigationView{ List(list.datas){i in HStack(spacing: 15){ VStack(alignment: .leading, spacing: 10){ Text(i.title).fontWeight(.heavy) Text(i.desc) } WebImage(url: URL(string: i.image)!, options: .highPriority, context: nil) }.padding(.vertical, 15) }.navigationBarTitle("Headlines") } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } struct detaType : Identifiable { var id : String var title : String var desc : String var url : String var image : String } class getDate : ObservableObject{ @Published var detas = [detaType]() init() { let source = "https://newsapi.org/v2/top-headlines?country=us&category=business&apiKey" let url = URL(string: source)! let session = URLSession(configuration: .default) session.dataTask(with: url) { (data, , err) in if err != nil{ print((err?.localizedDescription)!) return } let json = try! JSON(data: data!) for i in json["articles"]{ let title = i.1["title"].stringValue let description = i.1["description"].stringValue let url = i.1["url"].stringValue let image = i.1["urlToImage"].stringValue let id = i.1["publishedAT"].stringValue DispatchQueue.main.async { self.datas.append(dataType(id: id, title: title, desc: description, url:url, image: image )) } self.datas.append(dataType(id: id, title: title, desc: description, url:url, image: image )) }.resume() }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2021/05/01 07:32

そのソースコードだけでは情報が足りないので、youtube 動画の URL を教えてください。 また、エラーメッセージやソースコードは ``` と ``` の間に貼ってください。
animal_anny

2021/05/01 07:55

すみません、programingも初心者でteratailも初めて使ったもので、、 youtubeのurlはhttps://youtu.be/0rKgs9D9qSg です。 5分30秒くらいに映るNavigationVIew以下のところでエラーが出てしまいます。 回答いただけると幸いです。
hoshi-takanori

2021/05/01 11:34

動画を見ましたが、やはり質問文に貼られた以外の部分でエラーが発生しているように見えます。 ソースコード全体を貼ってもらえませんか? (API キーは隠した方がいいかも…。)
animal_anny

2021/05/01 13:05

ソースコード全体を載せました。 回答ご協力お願いいたします。
guest

回答3

0

ベストアンサー

とりあえず次の変更で動きましたよ。(diff の見方はお分かりでしょうか?)

  • CotentView じゃなくて ContentView ですね。n が抜けてます。

diff

1-struct CotentView: View { 2+struct ContentView: View {
  • 元のままでも動きますが、画像が大きすぎるので。

diff

1 WebImage(url: URL(string: i.image)!, options: .highPriority, 2 context: nil) 3+ .resizable() 4+ .aspectRatio(contentMode: .fit)
  • detaType じゃなくて dataType でしょうね。

diff

1-struct detaType : Identifiable { 2+struct dataType : Identifiable {
  • ここも getDate じゃなくて getData です。

diff

1-class getDate : ObservableObject{ 2+class getData : ObservableObject{
  • detas じゃなくて datas、detaType じゃなくて dataType です。

diff

1- @Published var detas = [detaType]() 2+ @Published var datas = [dataType]()
  • data と err の間に _ (アンダースコア) が必要です。これは 2 番目の引数を無視するという意味になります。

diff

1- session.dataTask(with: url) { (data, , err) in 2+ session.dataTask(with: url) { (data, _, err) in
  • publishedAT じゃなくて publishedAt ですね。最後の t は小文字。

diff

1- let id = i.1["publishedAT"].stringValue 2+ let id = i.1["publishedAt"].stringValue
  • self.datas.append( 〜 ) が 2 つありますが、後ろのやつは要らないはず。
  • 閉じかっこ } が 2 つ足りてません。

diff

1 DispatchQueue.main.async { 2 3 self.datas.append(dataType(id: id, title: title, desc: description, url:url, image: image )) 4 5 } 6 7- self.datas.append(dataType(id: id, title: title, desc: description, url:url, image: image )) 8+ } 9 10 }.resume() 11 12 13 } 14+}

投稿2021/05/01 16:07

hoshi-takanori

総合スコア7901

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

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

animal_anny

2021/05/02 04:57

わざわざありがとうございます!
hoshi-takanori

2021/05/02 06:58 編集

回答に書き忘れてましたが、元のコードで、struct や class の名前 (dataType や getData) の先頭が小文字なのは良くないですね。Swift では型名は大文字で始めることになってるので、。DataType や GetData とすべきです。特に、 @ObservedObject var list = getData() と書いてあったら普通は関数かメソッドの呼び出しにしか見えないので、非常に紛らわしいです…。
guest

0

ただ、変更後も多数エラーが発生しております。

私も動画の通りに打ち込んでみましたが、問題なく動きましたよ。
動画の通りに作っていないのでしょう。
よく見直してください。

イメージ説明

投稿2021/05/01 13:09

technocore

総合スコア7337

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

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

animal_anny

2021/05/01 13:11

本当ですか! わざわざありがとうございます。 もう一度見てみます。
animal_anny

2021/05/01 13:28

もしよろしければ、上の画像のようにコード全体を載せていただけませんか? よろしくお願いします。
technocore

2021/05/02 09:17

解決したようでよかったです。もうコードは載せなくても良いですね。 SwiftUI頑張ってください。
guest

0

@ObservedObject var list = getDate()

getData()の間違いではないですか?

投稿2021/05/01 09:33

technocore

総合スコア7337

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

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

animal_anny

2021/05/01 13:04

回答ありがとうございます。 getDate()となっていました。 ただ、変更後も多数エラーが発生しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問