2
votes

Le type 'string' n'a pas de membre 'playback'

En essayant de créer un xylophone dans xcode 10.1, en utilisant swift 4.2 sur iOS12, j'ai utilisé un bouton pour lire un fichier .wav et j'ai entré le code suivant mais l'erreur suivante apparaît:

"type 'String' n'a pas de membre 'playback'"

func playSound() {
        guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else { return }

        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
            try AVAudioSession.sharedInstance().setActive(true)

            /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
            player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

            /* iOS 10 and earlier require the following line:
             player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */

            guard let player = player else { return }

            player.play()

        } catch let error {
            print(error.localizedDescription)
        }
    }


4 commentaires

Êtes-vous sûr que votre projet est configuré pour Swift 4.2 et non une version antérieure?


Si vous êtes dans swift 4, utilisez AVAudioSessionCategoryPlayback au lieu de .playback pour la catégorie.


Votre code attend un fichier .mp3 mais le fichier son est-il vraiment un fichier .wav?


J'ai essayé d'utiliser AVAudioSessionCategoryPlayback au lieu de .playback. Ça ne marche toujours pas. Oui, j'ai également vérifié la version Swift sa 4.2. Et il a une extension .wav, il doit s'agir d'un fichier .wav, n'est-ce pas? Je suis si confus.


3 Réponses :


0
votes

Je regardais autour de StackOverflow et j'ai emprunté ce morceau de code qui fonctionne, je ne sais pas si c'est la manière conventionnelle de le faire.

Swift 4.2

< pré> XXX


0 commentaires

0
votes
func playSound() {

    let soundURL = Bundle.main.url(forResource: selectedSoundFileName, withExtension: "wav")
    do{
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
        audioPlayer.play()
    } catch {

    }
}
This is another variation that you might be able to try! Let me know if this format works for you. I built a xylophone app myself a long time ago inside of a Udemy course. Pretty much would be easier to put the sound files directly into your project and run them through there, than to pull them from anywhere in my opinion.this is the most "Swifty" way I could implement this for you.

2 commentaires

Ouais, je fais le même cours udemy maintenant: P. Vous devez également créer le var audioPlayer et importer AVfoundation. A part ça, ta réponse est la même que la mienne :)


Ouais, j'ai posté le mien littéralement en même temps que tu l'as fait haha ​​désolé pour ça!



0
votes

Si vous cliquez sur Passer à la définition sur AVAudioSession Xcode ouvrira le fichier source brut de la classe et de là, vous pourrez voir la structure de chaque méthode de la classe. Ceci est utile pour visualiser la structure de chaque fonction et pour déterminer les paramètres de données de chaque fonction. De plus, il y a des annotations au-dessus de chaque variante des fonctions de classe compatibles pour différentes cibles de déploiement iOS, indiquées par les annotations @available (iOS 11.0, *) . Nous nous concentrons sur la fonction open func setCategory dans cette classe.

Informations utiles dans le fichier source brut

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [.mixWithOthers, .allowAirPlay])
    print("Playback OK")
    try AVAudioSession.sharedInstance().setActive(true)
    print("Session is Active")
} catch {
    print(error)
}

J'ai édité la catégorie et les paramètres de mode dans ma fonction comme suit:

 Allowed categories: AVAudioSessionCategoryPlayback
 Allowed modes: AVAudioSessionModeDefault, AVAudioSessionModeMoviePlayback, AVAudioSessionModeSpokenAudio
 Allowed options: None. Options are allowed when changing the routing policy back to Default


0 commentaires