困っていること
ほとんど同じコードなのに以前は発生していなかったエラーが発生してしまいます。
発生しているエラーメッセージ
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}
どのように修正すればいいのか教えてください。お願いします。
もう一つ気になっているのは、post[0].user_idはpost[0].user_id!と強制アンラップしていますが、これは元々オプショナル型で定義されているということでしょうか。
そうすると、エラーが出ている行のpost[0].idの実体は何型になっているのでしょうか(Optional<String>型?)。
元々は空の変数(var post: [post] = [])として定義しています。
このコードのなかで(すいません、コードが長くなってしまうと思い質問のコードでは省略してしまっていました)同じ[post]型の値を代入する処理があります。
しかし、値が帰ってこない場合もあるかと思い(そしたらpostが空の変数になるので)強制アンラップをしました。
型はおそらくString型だと思います。
TakeOneさんの言及に同じく、私も似たようなコードを試していますが、やはり問題になるような原因はわかりませんでした(少なくとも、同じようなエラーがでる原因が追及できない)。
同じようなエラーを再現できる、必要最低限のコード(コピーしただけで再現できるコード)を提示していただくことは可能でしょうか。
もしかしたら、エラーが再現できるミニマムコードを作る過程でエラーの原因を質問者さんご自身が発見できる可能性もあります。
そもそも、Optional型ではない普通のString型に強制アンラップをかけようとしても、そのような記述を行った時点でエラーが出ます。ただ、SwiftUIの場合はTakeOneさんがおっしゃっているように、本質的な原因がでる行で必ずしもエラーが出るとは限りませんし、仮にからの配列を渡したとしても、それ以降のコードが正常に動作する保証もないと思います。
追加してみたのですがどうでしょうか?
回答3件
あなたの回答
tips
プレビュー