我正在尝试为JSON加载委派JSONLoaderDelegate
创建协议。我的另一个类叫JSONLoader
,应该将事件分派给它的委托(实现JSONLoaderDelegate
协议),如:
self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError)
JSONLoader的实现并不重要(imho)。但是我似乎在实现协议方面遇到了问题,这就是代码:
@objc protocol JSONLoaderDelegate {
optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader)
func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError)
func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader)
}
这看起来很简单,但我收到了一个错误:
方法无法标记@objc,因为参数的类型不能 用Objective-C表示。
指出了所有三个功能。
显然,如果删除@objc
属性,我就无法使用optional
作为该函数。我真的希望将jsonLoaderdidBeginLoading
作为可选项。任何想法/方法来解决这个问题?谢谢!
答案 0 :(得分:7)
我遇到了这个问题,因为我有一个没有父类的班级MyConnection
。
像这样。
public class MyConnection {
}
我不能在此之前加@objc
,因为我收到警告
只能从NSObject继承的类声明@objc
所以我将类改为继承自NSObject
。
喜欢这个
public class MyConnection: NSObject {
}
答案 1 :(得分:4)
我有同样的错误。 method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.
我在swift 2.0中将语法更改为以下内容。现在工作正常!
@objc protocol AppModelDelegate {
optional func compititorList(com:[Competitor]!)
}
class Competitor:NSObject{
var id:Int?
var title:String?
}
注意:竞争对手类类型已更改为NSObject,清除了委托规则违规
同样在NSJSON解析的情况下。我改成了以下内容。
if (_httpStatusCode == 200) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
var error : NSError?
print("responseString : \(responseString) ")
var service_result:NSDictionary = NSDictionary()
do {
let anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String:AnyObject]
service_result = anyObj
} catch let error as ErrorType {
print("json error: \(error)")
}
}
答案 2 :(得分:3)
3种方法的共同点是JSONLoader
参数,而我认为这会阻止您桥接协议。为了解决这个问题,你必须使它与objc兼容。
答案 3 :(得分:1)
JSONLoaderError.LoadError
这是枚举类型吗?您无法将Swift枚举转换为Obj-C代码。你需要使用int。