OC 的协议中的类方法,无法让 xcode 自动补全 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
wangyapu
V2EX    iDev

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

  •  
  •   wangyapu 361 天前 1708 次点击
    这是一个创建于 361 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,

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

    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 去支持这个特性呢?

    求指点!

    7 条回复    2024-10-21 11:09:26 +08:00
    iOCZS
        1
    iOCZS  
       361 天前
    应该也是支持的吧
    wangyapu
        2
    wangyapu  
    OP
       361 天前
    @iOCZS 你可以试下哈,我是尝试过,确实不行,并且去多处求证发现网上没有人讨论这个,才来发帖求助的 如果试过可以的话,求告知
    iOCZS
        3
    iOCZS  
       361 天前
    @protocol TestProtocol <NSObject>

    +(void)test;

    @end

    @interface HelloGLKitViewController : GLKViewController<TestProtocol>

    @end

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

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

    我这里的大前提是为了解耦,所以这个目标类,在当前文件里是不可见的,只能取出一个 Class 对象,即使注明这个 Class 对象符合某个协议,xcode 也不会提示方法名,但直接手打出来可以正常编译。
    iOCZS
        5
    iOCZS  
       359 天前
    @wangyapu 编译时能确定类型,就能有对应的提示。id<protocol>的时候,protocol 作为类型参考。但是 Class<protocol>这种是有问题的,因为它是有类型的,就是 Class ,这里我觉得 protocol 是多余的。
    iOCZS
        6
    iOCZS  
       359 天前
    @wangyapu OC 里只有遵循协议的类和擦除类型( id )遵循协议的对象,不存在既是某个类,又遵循某个协议的东西。Class<protocol>这种没有意义,你要么声明 Class 类的时候,同时声明它遵循 protocol 协议。要么你擦除它的类型信息,认为它是遵循某个协议的对象:id<protocol>。总之,你不能在编译时同时拥有类和协议两种身份。
    wangyapu
        7
    wangyapu  
    OP
       357 天前
    @iOCZS 厉害啊! 明白了,看来这条路是走不通的。 但这里的场景是不可能拿到具体类的,因为现在要做的东西就是模块间解耦。 现在还有个想法就是写 clang 插件,扩充一下 xcode 自动补全的功能
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5473 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:36 PVG 16:36 LAX 01:36 JFK 04:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86