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

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

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

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

Q&A

解決済

3回答

823閲覧

「Cannot subscript a value of incorrect or ambiguous type」のエラーがでます

medamawa

総合スコア5

Swift

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

0グッド

0クリップ

投稿2020/05/01 15:30

編集2020/05/02 00:26

困っていること

ほとんど同じコードなのに以前は発生していなかったエラーが発生してしまいます。

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

Cannot subscript a value of incorrect or ambiguous type

該当のソースコード

変数、構造体、メソッドの定義

swift

1@State var post: [Post] = [] 2@State var postUserInfo: [String: User] = [ : ] 3 4struct Post: Codable, Identifiable { 5 6 var id: String 7 var user_id: String 8 var text: String 9 var deleted_at: String 10 var created_at: String 11 var updated_at: String 12 13 enum CodingKeys: String, CodingKey { 14 15 case id 16 case user_id 17 case text 18 case deleted_at 19 case created_at 20 case updated_at 21 22 } 23 24} 25 26struct User: Codable, Identifiable { 27 28 var id: String 29 var screen_name: String 30 var name: String 31 var profile_image: String? 32 var email: String 33 var updated_at: String? 34 var created_at: String? 35 36} 37 38struct APIRequest{ 39 40 func getSpecifiedUser (_ id: String, completion: @escaping ([User]) -> ()) { 41 42 guard let url = URL(string: "APIのURL") else { return } 43 44 URLSession.shared.dataTask(with: url) { (data, _, _) in 45 46 let user = try! JSONDecoder().decode([User].self, from: data!) 47 48 DispatchQueue.main.async { 49 completion(user) 50 } 51 52 }.resume() 53 54 } 55 56}

該当のコード

swift

1HStack { 2 (省略) 3} 4.onAppear { 5 6 APIRequest().getSpecifiedUser(post[0].user_id!) { User in 7 self.postUserInfo[post[0].id] = User[0] // ここでエラーが発生しました(Cannot subscript a value of incorrect or ambiguous type) 8 9 } 10 11}

追加のコード

swift

1@State var id: String? 2 3VStack { 4 5 HStack { 6 (省略) 7 } 8 .onAppear { 9 (上記のコード) 10 } 11 12} 13.onAppear { 14 15 APIRequest().getPostDetail(self.id ?? "") { (Data) in 16 17 self.post = Data.post 18 19 } 20 21} 22 23// getPostDetail()では下記の型で値が返されます 24struct PostDetailResponseData: Codable { 25 26 var post: [Post] // 前述のPost型 27 28}

エラーが出ていない方のコード

変数、構造体の定義

swift

1@State var followers: [FollowsResponseData] = [] 2@State var userInfo: [String: User] = [ : ] 3 4struct FollowsResponseData: Decodable, Identifiable { 5 6 var id: String 7 var pivot: Pivot 8 9} 10 11struct Pivot: Decodable { 12 13 var following_id: String 14 var followed_id: String 15 16} 17 18struct User: Codable, Identifiable { 19 20 var id: String 21 var screen_name: String 22 var name: String 23 var profile_image: String? 24 var email: String 25 var updated_at: String? 26 var created_at: String? 27 28} 29 30struct APIRequest{ 31 32 func getSpecifiedUser (_ id: String, completion: @escaping ([User]) -> ()) { 33 34 guard let url = URL(string: "APIのURL") else { return } 35 36 URLSession.shared.dataTask(with: url) { (data, _, _) in 37 38 let user = try! JSONDecoder().decode([User].self, from: data!) 39 40 DispatchQueue.main.async { 41 completion(user) 42 } 43 44 }.resume() 45 46 } 47 48}

該当のコード

swift

1VStack { 2 (省略) 3} 4.onAppear { 5 APIRequest().getSpecifiedUser(follower.id) { User in 6 self.userInfo[follower.id] = User[0] 7 } 8 9}

どのように修正すればいいのか教えてください。お願いします。

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

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

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

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

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

TsukubaDepot

2020/05/01 22:53

もう一つ気になっているのは、post[0].user_idはpost[0].user_id!と強制アンラップしていますが、これは元々オプショナル型で定義されているということでしょうか。 そうすると、エラーが出ている行のpost[0].idの実体は何型になっているのでしょうか(Optional<String>型?)。
medamawa

2020/05/02 00:12 編集

元々は空の変数(var post: [post] = [])として定義しています。 このコードのなかで(すいません、コードが長くなってしまうと思い質問のコードでは省略してしまっていました)同じ[post]型の値を代入する処理があります。 しかし、値が帰ってこない場合もあるかと思い(そしたらpostが空の変数になるので)強制アンラップをしました。 型はおそらくString型だと思います。
TsukubaDepot

2020/05/02 02:40

TakeOneさんの言及に同じく、私も似たようなコードを試していますが、やはり問題になるような原因はわかりませんでした(少なくとも、同じようなエラーがでる原因が追及できない)。 同じようなエラーを再現できる、必要最低限のコード(コピーしただけで再現できるコード)を提示していただくことは可能でしょうか。 もしかしたら、エラーが再現できるミニマムコードを作る過程でエラーの原因を質問者さんご自身が発見できる可能性もあります。
TsukubaDepot

2020/05/02 02:42

そもそも、Optional型ではない普通のString型に強制アンラップをかけようとしても、そのような記述を行った時点でエラーが出ます。ただ、SwiftUIの場合はTakeOneさんがおっしゃっているように、本質的な原因がでる行で必ずしもエラーが出るとは限りませんし、仮にからの配列を渡したとしても、それ以降のコードが正常に動作する保証もないと思います。
medamawa

2020/05/02 04:06

追加してみたのですがどうでしょうか?
guest

回答3

0

自己解決

全体を見つめ直して書き直してみたら解決しました。
回答してくださった方々、ありがとうございました。

投稿2020/05/03 13:43

medamawa

総合スコア5

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

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

TakeOne

2020/05/03 15:09

この質問が他の人の役に立つよう、何をどのように修正したかを書いてください。
guest

0

提示されたコードが断片的すぎて同じエラーを再現できませんでしたが、
エラー箇所のpostが本当に @State var post: [Post] = []
定義したpostを使用しているのであれば、
次のようなコードでなければならないはずです。

swift

1 APIRequest().getSpecifiedUser(self.post[0].user_id) { User in 2 self.postUserInfo[self.post[0].id] = User[0] 3 4 }
  • 離脱するクロージャの中でプロパティにアクセスする時は self. をつける必要があります。
  • user_idはString型なので ! をつけることはできません。

SwiftUIを使ったコードは、エラーの原因と全然関係なさそうなところに
エラーが出ることがあるので、そのままコピペしてエラーが再現するコードを
示して質問する必要があります。

今回の問題は、関係ないと思って省略したコードの中にある可能性も十分考えられると思います。

投稿2020/05/02 02:27

TakeOne

総合スコア6299

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

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

0

すみません、寝ぼけていました。
KeyがStringの辞書型なので問題ないですね。
もう一回よく考え直してみます。


以下勘違い。

swift

1 self.postUserInfo[post[0].id] = User[0] // ここでエラーが発生しました(Cannot subscript a value of incorrect or ambiguous type)

上記のpostUserInfo[]の添字は辞書型をわたさなけれないけないのに、実際に渡しているのは文字型(String)なのでCannot subscript a value of incorrect or ambiguous typeというエラーが出ているのだと思います(「型が違う、もしくは曖昧な型」)。

定義を確認してみても、

swift

1@State var post: [Post] = [] 2@State var postUserInfo: [String: User] = [ : ] 3 4struct Post: Codable, Identifiable { 5 6 var id: String 7 // 以下略 8}

となっており、postUserInfoの添字は辞書型、Post.idString型なので、型が一致していません。

一方、動いている方ですが、

swift

1 self.userInfo[follower.id] = User[0]

となっています。

このfollwer.idは提示してあるコード中では定義されていないため確認できませんが(followersという別の名前の変数はありますが)、どこか別のところで辞書型として定義されていないでしょうか。

投稿2020/05/01 22:26

編集2020/05/01 22:38
TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問