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是类函数,因为它本身不起作用:|,谢谢