Q&A
前提
SwiftUIでインスタグラムのクローンアプリを作っています。
投稿機能を実装中に以下のエラーメッセージが発生しました。
実現したいこと
- 投稿機能を動作するようにする
- Swiftの文法の理解を深める
発生している問題・エラーメッセージ
ファイルパス/UploadPostView.swift:51:49 Cannot convert value of type 'Image' to expected argument type 'UIImage'
該当のソースコード
UploadPostView.swift
1import SwiftUI 2 3struct UploadPostView: View { 4 5 @State private var selectedImage: UIImage? 6 @State var postImage: Image? 7 @State var captionText = "" 8 @State var imagePickerRepresented = false 9 @ObservedObject var viewModel = UploadPostViewModel() 10 11 var body: some View { 12 13 if postImage == nil { 14 Button(action: { 15 self.imagePickerRepresented.toggle() 16 }, label: { 17 Image(systemName: "plus.circle") 18 .resizable() 19 .scaledToFill() 20 .frame(width: 180, height: 180) 21 .clipped() 22 .padding(.top) 23 .foregroundColor(.black) 24 }) 25 .sheet(isPresented: $imagePickerRepresented) { 26 loadImage() 27 } content: { 28 ImagePicker(image: $selectedImage) 29 } 30 } else if let image = postImage { 31 VStack { 32 HStack(alignment: .top) { 33 image 34 .resizable() 35 .scaledToFill() 36 .frame(width: 96, height: 96) 37 .clipped() 38 39 TextArea(text: $captionText, placeholder: "Enter your caption...") 40 } 41 .padding() 42 43 Button { 44 viewModel.uploadPost(image: image, caption: captionText) 45 46 captionText = "" 47 postImage = nil 48 } label: { 49 Text("Share") 50 .font(.system(size: 16, weight: .semibold)) 51 .frame(width: 360, height: 50) 52 .background(Color.blue) 53 .cornerRadius(5) 54 .foregroundColor(.white) 55 } 56 57 Spacer() 58 59 } 60 } 61 } 62} 63 64extension UploadPostView { 65 func loadImage() { 66 guard let selectedImage = selectedImage else { 67 return 68 } 69 postImage = Image(uiImage: selectedImage) 70 } 71} 72
UploadPostViewModel.swift
1import SwiftUI 2import Firebase 3import FirebaseStorage 4 5class UploadPostViewModel: ObservableObject { 6 7 func uploadPost(image: UIImage, caption: String) { 8 guard let user = AuthViewModel.shared.currentUser else { return } 9 guard let imageData = image.jpegData(compressionQuality: 0.5) else { return } 10 11 let filename = NSUUID().uuidString 12 let ref = Storage.storage().reference(withPath: "/post_images\(filename)") 13 14 ref.putData(imageData, metadata: nil) { (_, err) in 15 if let err = err { 16 print(err.localizedDescription) 17 return 18 } 19 20 ref.downloadURL { (url, err) in 21 if let err = err { 22 print(err.localizedDescription) 23 return 24 } 25 26 guard let imageURL = url?.absoluteString else { return } 27 28 guard let uid = user.id else { return } 29 30 let data = [ 31 "caption": caption, 32 "timestamp": Timestamp(date: Date()), 33 "likes": 0, 34 "imageURL": imageURL, 35 "ownerUid": user.id, 36 "ownerImageURL": user.profileimageURL, 37 "ownerUsername": user.username 38 ] as [String: Any] 39 40 Firestore.firestore().collection("posts").addDocument(data: data) { err in 41 if let err = err { 42 print(err.localizedDescription) 43 return 44 } 45 } 46 47 } 48 } 49 } 50} 51
試したこと
Cannot convert value of type 'Image' to expected argument type 'UIImage'で調べたところ、以下のページに辿り着きました。
https://stackoverflow.com/questions/70927891/cannot-convert-value-of-type-image-to-expected-argument-type-uiimage
和訳すると「タイプ 'Image' の値を期待される引数タイプ 'UIImage' に変換できません。」とのことなので型変換するのかな?という認識なのですがそれで合っているでしょうか?
どう書き換えたら良いのかがわからない状態です。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
macOS Ventura 13.0
Xcode Version 14.1
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。