我遇到過幾次這個問題,我試圖將一個函式從一個 swift 檔案傳遞??到另一個檔案,但我收到錯誤訊息“在范圍內找不到‘_’”。我想知道為什么會發生這種情況以及如何解決它?我嘗試創建一個公共函式, public func fetchJokesAPI() ,同時使這個函式的類成為一個 Observable 物件,以便我能夠在我的 swift 檔案中傳遞這個函式。為什么編譯器在作用域中找不到我的函式?下面是一些代碼,以進一步參考該問題。
//Model
import Foundation
struct DecodingError: Error{}
struct JokesModel: Codable {
let type: String
let value: Value
}
// MARK: - Value
struct Value: Codable {
let id: Int
let joke: String
}
class JokesAPI {
var session: URLSession?
// MARK: Getting random jokes from API endpoint
func fetchJokes() {
guard let url = URL(string: "https://api.icndb.com/jokes/random/") else {
print("Cannot generate URL")
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print(error.localizedDescription)
return
}
guard (response as? HTTPURLResponse) != nil else {
print("No Response")
return
}
struct JokesResponse: Decodable {
let data: [JokesModel]
}
guard let data = data, let dataString = String(data: data, encoding: .utf8)
else {
print("No Data")
return
}
do {
let jokeResponse = try JSONDecoder().decode(JokesResponse.self, from: data)
print(jokeResponse.data)
} catch {
print("Error decoding joke response:", error)
}
}
task.resume()
}
}
// Another Swift File that is a Coco touch file.
import UIKit
import Foundation
class HomeViewController: UIViewController {
private let service = JokesAPI()
private var joke: [JokesModel]?
@IBOutlet var tellAeAJokeButton: UIButton!
@IBOutlet var jokeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
service.fetchJokes()
}
@IBAction func didPressBtn() {
// MARK: Actions for both fetching a joke from the API, & Text-Speech using AI Voice
service.fetchJokes()
joke = [JokesModel]()
jokeLabel.text = JokesModel().joke
// Value of type 'JokesModel' has no member 'joke'
// Missing argument for parameter 'from' in call
uj5u.com熱心網友回復:
您收到錯誤是因為您需要一個類的實體來呼叫您的函式。
為了讓你的代碼作業,你可以做這樣的事情,你的 viewController 接受JokesWebService這樣的服務,如果你已經有一個服務,更好的選擇是在 viewModel 上提供服務,但如果沒有,這應該可以幫助你開始:
import UIKit
class HomeViewController: UIViewController {
@IBOutlet var tellAeAJokeButton: UIButton!
private var service: JokesWebService!
override func viewDidLoad() {
super.viewDidLoad()
service = JokesWebService()
}
@IBAction func didPressBtn() {
service.fetchJokesAPI()
}
}
uj5u.com熱心網友回復:
由于沒有JokesWebService可呼叫的實體,您收到此錯誤fetchJokesAPI()。看到您在 UI 中使用 Storyboards,我建議您將服務的初始化程式放在viewDidLoad()呼叫中,如下所示:
class HomeViewController: UIViewController {
@IBOutlet var tellAeAJokeButton: UIButton!
private var jokesService: JokesWebService!
override func viewDidLoad() {
super.viewDidLoad()
jokesService = JokesWebService()
}
@IBAction func didPressBtn() {
jokesService.fetchJokesAPI()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/401144.html
