无法在具有 @objc 属性的协议中使用自定义 class?
Unable to use custom class in a protocol with @objc attribute?
我正在尝试为 JSON 加载委派创建协议,JSONLoaderDelegate
。我的另一个 class,称为 JSONLoader
,应该将事件分派给它的委托(实现 JSONLoaderDelegate
协议),例如:
self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError)
JSONLoader 的实现并不那么重要(恕我直言)。但是我似乎无法实现协议,这是代码:
@objc protocol JSONLoaderDelegate {
optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader)
func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError)
func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader)
}
这对我来说看起来很简单,但我收到一个错误:
method cannot be marked @objc because the type of the parameter cannot
be represented in Objective-C.
指向所有三个函数。
显然,如果我删除 @objc
属性,我将无法使用该函数的 optional
。我真的很想保留 jsonLoaderdidBeginLoading
作为可选的。有什么想法/方法可以解决这个问题吗?谢谢!
这 3 种方法的共同点是 JSONLoader
参数,这就是我认为阻止您桥接协议的原因。为了解决这个问题,你必须让它与objc兼容。
JSONLoaderError.LoadError
这是枚举类型吗?您不能将 Swift 枚举转换为 Obj-C 代码。您需要改用 int。
我遇到了这个问题,因为我有一个没有 parent class 的 class MyConnection
。
像这样。
public class MyConnection {
}
我不能把 @objc
放在这之前,因为我收到警告
Only classes that inherit from NSObject can be declared @objc
所以我把class改为继承自NSObject
。
像这样
public class MyConnection: NSObject {
}
我有同样的错误。 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?
}
注意:竞争对手 class 类型已更改为 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)")
}
}
我正在尝试为 JSON 加载委派创建协议,JSONLoaderDelegate
。我的另一个 class,称为 JSONLoader
,应该将事件分派给它的委托(实现 JSONLoaderDelegate
协议),例如:
self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError)
JSONLoader 的实现并不那么重要(恕我直言)。但是我似乎无法实现协议,这是代码:
@objc protocol JSONLoaderDelegate {
optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader)
func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError)
func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader)
}
这对我来说看起来很简单,但我收到一个错误:
method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.
指向所有三个函数。
显然,如果我删除 @objc
属性,我将无法使用该函数的 optional
。我真的很想保留 jsonLoaderdidBeginLoading
作为可选的。有什么想法/方法可以解决这个问题吗?谢谢!
这 3 种方法的共同点是 JSONLoader
参数,这就是我认为阻止您桥接协议的原因。为了解决这个问题,你必须让它与objc兼容。
JSONLoaderError.LoadError
这是枚举类型吗?您不能将 Swift 枚举转换为 Obj-C 代码。您需要改用 int。
我遇到了这个问题,因为我有一个没有 parent class 的 class MyConnection
。
像这样。
public class MyConnection {
}
我不能把 @objc
放在这之前,因为我收到警告
Only classes that inherit from NSObject can be declared @objc
所以我把class改为继承自NSObject
。
像这样
public class MyConnection: NSObject {
}
我有同样的错误。 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?
}
注意:竞争对手 class 类型已更改为 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)")
}
}