2

我有一个 Go 界面

type GetResponse interface { OnResult(json string) }

我必须使用此接口从 ObjC 订阅该事件 OnResult。

func Subscribe( response GetResponse){ response.OnResult("some json") }

ObjC bind 给了我一个对应的协议和一个基础类

@interface GetResponse : NSObject <goSeqRefInterface, GetResponse> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)onResult:(NSString*)json;
@end

所以,我需要在我的 ObjC 环境中获取这个 json。我怎样才能做到这一点?

  1. 子类化如果我将此 GetResponse 子类化,或者只是按原样使用它并传递给订阅例程,它会崩溃 'go_seq_go_to_refnum on objective-c objects is not allowed'
  2. 类别如果我使用协议支持在 Go 端创建结构,我不能对其进行子类化,但至少它不会崩溃:

    type GetResponseStruct struct{}
    func (GetResponseStruct) OnResult(json string){log.Info("GO RESULT")}
    func CreateGetResponse() *GetResponseStruct{ return &GetResponseStruct{}}
    

    我有一个实体对象,没有明显的方法来连接我的回调。如果我创建一个类别并覆盖 onResult 例程,则不会调用它。仅仅因为覆盖现有的类方法不是根据 AppleDoc 确定的行为。任何时候从 Go 调用 OnResult,都会调用默认实现并出现“GO RESULT”。

  3. Swizzling我尝试使用 category 和 swizzle(用我的重命名方法替换方法的实现),但它只有在我从 ObjC env 调用 onResult 时才有效。

有什么办法可以解决我的问题吗?或者我只是不很准确地红色文档?请帮我

4

1 回答 1

2

我今天遇到了类似的问题。我认为这是 gomobile 中的一个错误,但毕竟这是我对 swift/objc 的误解。https://github.com/golang/go/issues/35003

该错误的 TLDR 是您必须子类化协议,而不是接口。如果您使用的是 swift ,那么您可以子类化GetResponseProtocol

class MyResponse: GetResponseProtocol

如果在 objc 中,那么您可能希望直接实现 GetResponse 协议,而不是子类化接口。

于 2019-10-19T06:39:52.793 回答