Решение
Я точно не знаю, что происходит под капотом, но в ЛЮБОЙ сетевой операции это также должно быть асинхронным (то есть, для извлечения данных потребуется определенное время).
let endResults = musixrequest.gettingLyrics(url: url)
Если это выполняется синхронно в главном потоке, он заблокирует его, поэтому пользователь не сможет взаимодействовать с приложением, что довольно плохо. Поскольку в вашем коде он асинхронный, вы сразу же читаете значение в следующей строке, здесь:
if !endResults.isEmpty {
print("The end results are \(endResults)")
} else {
print("No results found")
}
Маловероятно, что работа сети завершится за один шаг строки, поэтому у вас там не будет данных.
Что вы должны сделать, это передать обработчик завершения в этом методе:
public func gettingLyrics(url : String) -> String
и отправить в основную ветку следующим образом:
DispatchQueue.main.async {
// do you UI stuff here
}
Измените свою функцию следующим образом:
public func gettingLyrics(url : String, completionHandler: (String) -> Void)
и вызов обработчика завершения в ветке успеха:
completionHandler(String(describing:json))