MST

星途 面试题库

面试题:Objective-C 协议在多对象交互中的应用

假设有三个类:`ViewController`、`DataFetcher` 和 `DataProcessor`。`ViewController` 需要获取数据并处理数据,`DataFetcher` 负责从网络获取数据,`DataProcessor` 负责处理获取到的数据。请使用协议设计这三个类之间的交互,要求 `ViewController` 能调用 `DataFetcher` 获取数据,并将获取到的数据传递给 `DataProcessor` 进行处理,描述清楚协议的定义、类对协议的遵循及具体实现步骤。
46.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 协议定义
    • 首先定义一个协议,用于 DataFetcherViewController 传递获取到的数据。
    protocol DataFetching {
        func fetchData(completion: @escaping (Data?) -> Void)
    }
    
    • 再定义一个协议,用于 ViewController 将获取到的数据传递给 DataProcessor 进行处理。
    protocol DataProcessing {
        func process(data: Data?)
    }
    
  2. 类对协议的遵循及实现
    • DataFetcher
    class DataFetcher: DataFetching {
        func fetchData(completion: @escaping (Data?) -> Void) {
            // 这里进行网络请求获取数据的实际逻辑
            // 假设使用 URLSession 进行网络请求
            let url = URL(string: "https://example.com/api/data")!
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                if let error = error {
                    print("Error fetching data: \(error)")
                    completion(nil)
                    return
                }
                completion(data)
            }
            task.resume()
        }
    }
    
    • DataProcessor
    class DataProcessor: DataProcessing {
        func process(data: Data?) {
            if let data = data {
                // 这里进行数据处理的实际逻辑
                let string = String(data: data, encoding:.utf8)
                print("Processed data: \(string?? "No valid string from data")")
            } else {
                print("No data to process")
            }
        }
    }
    
    • ViewController
    class ViewController {
        let dataFetcher: DataFetching
        let dataProcessor: DataProcessing
    
        init(dataFetcher: DataFetching, dataProcessor: DataProcessing) {
            self.dataFetcher = dataFetcher
            self.dataProcessor = dataProcessor
        }
    
        func startDataFlow() {
            dataFetcher.fetchData { [weak self] data in
                self?.dataProcessor.process(data: data)
            }
        }
    }
    
  3. 使用示例
    let fetcher = DataFetcher()
    let processor = DataProcessor()
    let viewController = ViewController(dataFetcher: fetcher, dataProcessor: processor)
    viewController.startDataFlow()
    

在上述代码中:

  • 定义了 DataFetchingDataProcessing 两个协议,分别规范了数据获取和数据处理的行为。
  • DataFetcher 类遵循 DataFetching 协议,实现从网络获取数据的逻辑,并通过闭包将获取到的数据返回。
  • DataProcessor 类遵循 DataProcessing 协议,实现对获取到的数据进行处理的逻辑。
  • ViewController 类持有 DataFetchingDataProcessing 类型的实例,并在 startDataFlow 方法中通过调用 DataFetcher 获取数据,然后将数据传递给 DataProcessor 进行处理。