Кодирование и декодирование Swift JSON

#swift

#swift

Вопрос:

Я пытаюсь вернуть JSON к завершению:

 func getNowPlayingView(completion: @escaping ([NowPlayingData]) -> ()) {
         
        
        
        let podcast = try! JSONDecoder().decode(MusicPlayer.NowPlayingData.self, from: Data(MusicPlayer.JN.utf8))
      
                       //print(data!)
                      // let episode = podcast.programs
                      DispatchQueue.main.async{
                          // The array is stored under programs now
                       
                        completion(podcast)
                      }
         
    }
  

Однако на completion(podcast) я получаю Cannot convert value of type 'MusicPlayer.NowPlayingData' to expected argument type '[MusicPlayer.NowPlayingData]'

 struct NowPlayingData: Codable, Identifiable {
    var id = UUID()
    var artist : String
    var song : String
    var cover : String
}

  

Вот что у меня получилось

Вы можете видеть на снимке экрана, что он отправляет строку JSON в представление.

добавить изображение

код для этого следующий

 func getNowPlayingView(completion: @escaping (String) -> Void){
         
        
        
      
           completion(MusicPlayer.JN)
     
    }
  

Обновить

Немного изменен код, чтобы отразить комментарии вадиана, и мое представление сошло с ума

ПРОСМОТР В МедиаПЛЕЕРЕ

 struct MediaPlayerView: View {
    @State private var uuid = UIDevice.current.identifierForVendor?.uuidString
    @State private var playingtye = ""
    @State var NowPlayingInfo: [MusicPlayer.NowPlayingData]
    
    
    
    
    
    @State private var playing = ""
    var body: some View {
        VStack{
            Text(String(uuid!))
            Text(playingtye)
            Text(NowPlayingInfo.first!.artist)
            Text(playing)
        }
            .onAppear{
                Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in
                       // do stuff 42 seconds later
                                    MusicPlayer().gettype { type in
                                       self.playingtye = type
                                   }
                                    MusicPlayer().getNowPlayingView { (podcast) in
                                        self.NowPlayingInfo = podcast
                                    }
                   }
               
                
                if(MusicPlayer.shared.player!.rate != 0)
                {
                    self.playing = "yes"
                }
                else
                {
                    self.playing = "no"
                }
        }
          
    }
}
  

Комментарии:

1. Вы декодируете один объект, а типом параметра закрытия является массив. Это классическое несоответствие типов, как четко указано в ошибке.

2. Итак, как вы отправляете отдельный объект

3. Измените тип замыкания на (NowPlayingData)->() .

4. @vadian не удается преобразовать значение типа ‘String’ в ожидаемый тип аргумента ‘Data’

5. Во-первых, я написал свои комментарии перед вашей правкой, а во-вторых, пожалуйста, научитесь читать сообщения об ошибках. Несоответствие типов — это очень простая и очень понятная ошибка.