J’ai une difficulté avec la notion de Singleton. J’ai bien compris le but, mais pas exactement la manière de faire…
Voici mon code:
import UIKit
import AVFoundation
import AVKit
class Player {
private static var s_instance:Player? = nil
public static var shared:Player {
if s_instance == nil {
s_instance = Player()
}
return s_instance!
}
private static var name = String()
static let radio = AVPlayer()
private static let urlabc = AVURLAsset(url: URL(string: "http://xxxxxxxxxxxxxabc.m3u")!)
private static let urldef = AVURLAsset(url: URL(string: "http://xxxxxxxxxxxxxdef.m3u")!)
private static let urlghi = AVURLAsset(url: URL(string: "http://xxxxxxxxxxxxxghi.m3u")!)
func play(radio:String, bitrate:Int) {
var url:AVURLAsset
switch radio {
case "abc":
Player.name = "abc"
url = Player.urlabc
case "def":
Player.name = "def"
url = Player.urldef
case "ghi":
Player.name = "ghi"
url = Player.urlghi
default:
Player.name = "abc"
url = Player.urlabc
}
let playerItem = AVPlayerItem(asset: url)
Player.radio.replaceCurrentItem(with: playerItem)
Player.radio.rate = 1.0
Player.radio.play()
}
func getName() -> String {
return Player.name
}
}
dans tous mes ViewController’s, je fais: let player = Player.shared
au lieu de let player = Player()
Comme indiqué dans les videos.
Mais je ne récupère pas le bon nom quand je fais let onair = player.getName()
Je pense que mon problème viens de mon Singleton, mais je ne vois pas comment m’y prendre. si qqn peut m’aiguiller, ça serait vraiment apprécié
ben c’est normal que cela retourne toujours abc, c’est ta valeur par défaut dans ton switch…
dans ton exemple, tu n’appelles jamais ta fonction play avec le paramètre radio rempli avec une chaine donc il est toujours égal à défaut donc à ‘abc’…
Alor en fait je n’avais pas vu mais ton erreur vien de ta fonction
func getName() → String {
return Player.name
}
il faudrait plutot faire :
func getName() → String {
return self.name
}
En fait l’idée du Singleton c’est d’avoir une seule et meme instance d’une classe utilisable partout dans l’app a n’importe quel moment. Du coup a part la variable qui stock l’instance de ta classe tu n’a pas besoin de mettre toute tes variables en static.
Je ne suis pas sûr que l’erreur vienne de la fonction getName() parce qu’en reprenant son code, je n’ai pas d’erreur, la fonction me retourne la bonne valeur.
Cependant, je suis de ton avis sur le sujet du singleton