Swift URLSession GET JSON with timeout

Swift
import Foundation

func fetchJSON(_ url: URL, timeout: TimeInterval = 10) throws -> Any {
    var request = URLRequest(url: url)
    request.timeoutInterval = timeout
    let semaphore = DispatchSemaphore(value: 0)
    var result: Result<Any, Error> = .failure(URLError(.unknown))
    URLSession.shared.dataTask(with: request) { data, _, error in
        defer { semaphore.signal() }
        if let error { result = .failure(error); return }
        guard let data else { result = .failure(URLError(.badServerResponse)); return }
        result = Result { try JSONSerialization.jsonObject(with: data) }
    }.resume()
    guard semaphore.wait(timeout: .now() + timeout + 1) == .success else {
        throw URLError(.timedOut)
    }
    return try result.get()
}