OC 的协议中的类方法,无法让 xcode 自动补全

75 天前
 wangyapu

如题,

协议中的实例方法,是可以自动补全的,例如:

id<MainServiceProtocol> obj = [[SIMBeeHive shareInstance] createService:@protocol(MainServiceProtocol)];
    obj tes
    // 这里会自动补全 MainServiceProtocol 协议中的实例方法

但如果是类方法,就无法自动补全,手打出来是没问题的:

Class<AClassServiceProtocol> aClassObj = [[SIMBeeHive shareInstance] createClassService:@protocol(AClassServiceProtocol)];
    [(Class <AClassServiceProtocol>)aClassObj aClassMethod:@"" aStringParam2:@""];
    // 这个方法是纯手打的

目前的猜想,xcode 的 Clang 自动补全压根没想过支持协议中的类方法,那有没有办法去修改 clang 去支持这个特性呢?

求指点!

1281 次点击
所在节点    iDev
7 条回复
iOCZS
75 天前
应该也是支持的吧
wangyapu
75 天前
@iOCZS 你可以试下哈,我是尝试过,确实不行,并且去多处求证发现网上没有人讨论这个,才来发帖求助的😂 如果试过可以的话,求告知
iOCZS
75 天前
@protocol TestProtocol <NSObject>

+(void)test;

@end

@interface HelloGLKitViewController : GLKViewController<TestProtocol>

@end

[HelloGLKitViewController test]是有提示的
wangyapu
73 天前
@iOCZS 抱歉,我前面忘了描述地精准一点了。 我这里的类是满足某个协议的动态类(虽然通过代码是能看出来)

像你写的,直接在现有的类上面注明满足某个协议这种,的确是可以代码提示的。

我这里的大前提是为了解耦,所以这个目标类,在当前文件里是不可见的,只能取出一个 Class 对象,即使注明这个 Class 对象符合某个协议,xcode 也不会提示方法名,但直接手打出来可以正常编译。
iOCZS
73 天前
@wangyapu 编译时能确定类型,就能有对应的提示。id<protocol>的时候,protocol 作为类型参考。但是 Class<protocol>这种是有问题的,因为它是有类型的,就是 Class ,这里我觉得 protocol 是多余的。
iOCZS
73 天前
@wangyapu OC 里只有遵循协议的类和擦除类型( id )遵循协议的对象,不存在既是某个类,又遵循某个协议的东西。Class<protocol>这种没有意义,你要么声明 Class 类的时候,同时声明它遵循 protocol 协议。要么你擦除它的类型信息,认为它是遵循某个协议的对象:id<protocol>。总之,你不能在编译时同时拥有类和协议两种身份。
wangyapu
70 天前
@iOCZS 厉害啊! 明白了,看来这条路是走不通的。 但这里的场景是不可能拿到具体类的,因为现在要做的东西就是模块间解耦。 现在还有个想法就是写 clang 插件,扩充一下 xcode 自动补全的功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1080907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX