Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果符合协议,则swift方法接受参数_Ios_Swift_Delegates - Fatal编程技术网

Ios 如果符合协议,则swift方法接受参数

Ios 如果符合协议,则swift方法接受参数,ios,swift,delegates,Ios,Swift,Delegates,我有一个名为WebServiceProtocol的协议和如下方法: class func executeRequest(delegate:__SOMETHING__,url:String,postParameters:[String:String],headerParameters:[String:String]){ //Do something and call delegate } <? extends SomeClass> 我想要一个条件参数,用于检查输入是否符合We

我有一个名为
WebServiceProtocol
的协议和如下方法:

class func executeRequest(delegate:__SOMETHING__,url:String,postParameters:[String:String],headerParameters:[String:String]){
   //Do something and call delegate
}
<? extends SomeClass>
我想要一个条件参数,用于检查输入是否符合
WebServiceProtocol
接受它

我打算编写一个全局类函数,它可以处理每个输入,可能是ViewController或NSObject类

在java for类中,我们这样做:

class func executeRequest(delegate:__SOMETHING__,url:String,postParameters:[String:String],headerParameters:[String:String]){
   //Do something and call delegate
}
<? extends SomeClass>
斯威夫特

protocol AuthenticationLoginProtocol {
    func onSuccess(data:NSDictionary)
    func onFailure(data:NSDictionary)
}

class Authentication:NSObject,WebServiceProtocol{

   func attempLogin(delegate:ViewController,emial:String,password:String){

        var params = [String:String]();
        params["key1"]="value1"
        params["key2"]="value2"

        WebService.executeRequest(self, url: "", postParameters: params, headerParameters: params)

    }

    func onDataReceived(data: NSDictionary!) {

    }
    func onFailure() {

    }

}
更新 您正在尝试引用类型方法中的实例。而不是这个,

WebService.executeRequest(self, url: "", postParameters: params, headerParameters: params)
写下:

WebService.executeRequest(Authentication.self, url: "", postParameters: params, headerParameters: params)
然后在后面的示例中,例如
身份验证

class Authentication: NSObject, WebServiceProtocol {

    // ...

    func someMethod() {
        WebService.executeRequest(self, url: "", postParameters: ["1": "2"], headerParameters: ["1": "2"])
    }

    // ...
}
原始答案 您可以为协议创建具有类型约束的泛型函数:

func myFunc<T: WebServiceProtocol>(input: T) {
  // input surely conforms to WebServiceProtocol
}
func myFunc(输入:T){
//输入肯定符合WebServiceProtocol
}
这样,T可以是任何类型,只要它符合
WebServiceProtocol


有关更多详细信息,请参阅类型约束。

如果您使输入以您的协议作为参数类型,则编译器将仅在该函数的参数实现该协议时进行编译,如上所述

import UIKit

protocol WebServiceProtocol {

}

class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!

    func takeProtocolAsInput(input: WebServiceProtocol) {

    }

    func otherFunc() {
        takeProtocolAsInput(A())

        // Compile-time error: B does not conform to WebServiceProtocol
        takeProtocolAsInput(B())
    }
}

class A: WebServiceProtocol {

}

class B {

}

@József-Vesza解决方案很好,因为如果您试图传入一个不符合
WebServiceProtocol
的对象,Xcode会让您知道。但是,如果您希望能够将任何内容(如问题中所述)传递给您的函数,您可以执行以下操作:

func myFunc(obj: Any) {
    if let webService = obj as? WebServiceProtocol {
        // Do stuff with webService...
    }
}

您可以将该方法设置为泛型

class func executeRequest<T: WebServiceProtocol>(delegate: T,url:String,postParameters:[String:String],headerParameters:[String:String]) {

}
class func executeRequest(委托:T,url:String,后参数:[String:String],头参数:[String:String]){
}

关于这种方法和@Will M.的区别有很多不同之处。

即使参数无效,也希望方法调用成功吗?哦。。您有不同的问题,请参阅我的更新答案:)这其实是我的问题!但是我想将
self
作为参数传递给另一个名为
Authentication
的类,该类符合
WebServiceProtocol
的要求,您可以发布该类的代码来澄清您的问题吗?似乎如果您正在传递self,并且self是一个符合WebServiceProtocol的身份验证,那么它应该编译并工作这可能会工作,但它破坏了Swift作为强类型语言的目的:)我同意,但问题要求使用一个“可用于每个输入的全局函数”。这适用于作为输入的
Authentication()
,但不适用于
self
,这是一个
Authentication
示例。相同的错误:
无法使用类型的参数列表调用“executeRequest”(Authentication.Type,url:String,postParameters:[String:String],headerParameters:[String:String])”
我在我的答案中添加了一个新方法,它不会给出任何错误。谢谢,不是编译错误!让我进一步测试一下:DOh!,attempLogin是类函数,因为它本身不起作用:|,谢谢