我遇到过这个问题几次,当我试图从一个swift文件传递一个函数到另一个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
1条答案
按热度按时间sxissh061#
您收到错误是因为您需要类的示例来调用函数。
为了让代码正常工作,你可以这样做,你的viewController接受一个
JokesWebService
的服务,如果你已经有了一个viewModel,更好的选择是让服务在viewModel上,如果没有,这应该可以让你开始: