xcode Swift无法在范围内找到“”

r8xiu3jd  于 2022-12-19  发布在  Swift
关注(0)|答案(1)|浏览(166)

我遇到过这个问题几次,当我试图从一个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
sxissh06

sxissh061#

您收到错误是因为您需要类的示例来调用函数。
为了让代码正常工作,你可以这样做,你的viewController接受一个JokesWebService的服务,如果你已经有了一个viewModel,更好的选择是让服务在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() 
    }
}

相关问题