【问题标题】:Missing argument for parameter 'responder' in call swift快速调用中缺少参数“响应者”的参数
【发布时间】:2015-07-30 13:58:53
【问题描述】:

好的,所以我在这里有点疯狂,试图了解我的代码问题出在哪里。我试图让单独的类进行通信,以便我可以在文件下载过程中处理 UI 元素。

我选择了一个似乎完全符合我需求的协议解决方案:

协议:

protocol DownloadResponder : class {
    func downloadFinished()
}

下载类: (为了这个问题,我只显示download_zip func 和didFinishDownloadingToURL 代表)

import UIKit
import Foundation

typealias CompleteHandlerBlock = () -> ()

class fileDownloader: NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate {

    //responder
    var responder : DownloadResponder?

    init(responder : DownloadResponder) {
        self.responder = responder
    }

    var session: NSURLSession!
    var handlerQueue: [String : CompleteHandlerBlock]!

//    class var sharedInstance: fileDownloader {
//        struct Static {
//            static var instance : fileDownloader?
//            static var token : dispatch_once_t = 0
//        }
//        
//        dispatch_once(&Static.token) {
//            Static.instance = fileDownloader()
//            Static.instance!.handlerQueue = [String : CompleteHandlerBlock]()
//        }
//        
//        return Static.instance!
//    }

    func download_zip(sURL: String, destination:String, name:String, fileis:Int) {

        var session:NSURLSessionTask!
        var sessionConfiguration:NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.visi")
        sessionConfiguration.HTTPMaximumConnectionsPerHost = 5

        self.session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)
        var url = NSURLRequest(URL: NSURL(string: sURL)!)
        var downloadTask:NSURLSessionDownloadTask = self.session.downloadTaskWithRequest(url)

        downloadTask.resume()
    }

    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
        println("session \(session) has finished the download task \(downloadTask) of URL \(location).")

        responder?.downloadFinished()
    }

我的 FileInfo ViewController 中的 downloadFinished 函数

func downloadFinished() {
        downloadLbl.text = "Downloaded"
        println("DOWNLOAD OVER")
    }

最后,我的 FileInfo ViewController 中的函数:

func downloadFile(sender:UIButton!)
    {
     // some code...   

     fileDownloader().download_zip(datastring, destination: path, name: naming, fileis: self.fileId)
    }

我的视图控制器中的这个函数调用fileDownloader().download_zip(datastring, destination: path, name: naming, fileis: self.fileId) 触发了我在添加协议之前没有的错误。它说:Missing argument for parameter 'responder' in call。 我想不出任何解决方案,所以如果有人知道它是什么请帮忙!

【问题讨论】:

    标签: ios swift compiler-errors xcode6 protocols


    【解决方案1】:

    fileDownloaderinit 方法中,您期望在downloadFile 方法中初始化fileDownloader 时没有提供参数responder: DownloadResponder

    所以代替:

    fileDownloader().download_zip(...
    

    做:

    fileDownloader(DownloadResponderImplementation()).download_zip(...
    

    这假设您还实现了 DownloadResponder 协议,例如:

    class DownloadResponderImplementation: DownloadResponder {
       func downloadFinished() {
          //Do something here
       }
    }
    

    【讨论】:

    • 你能解释一下吗?这不是我习惯的东西
    • 好的,但我试过了。它也返回一个错误......错误如下: 'DownloadResponder' 无法构造,因为它没有可访问的初始化程序。我做错事情了?代码如我的问题所示。
    • 嗯,DownloadResponder 是一个协议,所以您需要创建一个实现 DownloadResponder 协议的类,并将其作为 fileDownloader 的响应者传入。
    • 我不确定我是否理解。我确实使用我的 DownloadResponder 协议(我在上面描述过)创建了一个类,然后我将协议传递给我的 viewController 类所以......我在那里错过了什么?
    • 如果FileInfo ViewController实现了DownloadResponder协议,可以在downloadFile函数中调用fileDownloader(self)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多