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
IvanLing
V2EX  ›  iDev

Swift class 实现 Objective-C 写的 protocol 的小坑

  •  
  •   IvanLing · 2016-04-27 18:50:59 +08:00 · 2763 次点击
    这是一个创建于 3165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是 Objective-C Protocol 里面的出问题的函数

    -(void)didReceiveData:(NSData*)data Device:(DFBlunoDevice*)dev;
    

    用 Swift 实现的时候, Xcode 会自动将参数转为小写

    func didReceiveData(data: NSData!, device dev: DFBlunoDevice!) {  }
    

    然后 Xcode 就会报错, 提示我 class 不 conform 那个 Protocol 。如果强行将 swift 函数的 device 写成 Device, Xcode 依旧是报错,要求我改成小写。

    最后我的解决方案是直接将 Objective-C 的函数改写成这样

     -(void)didReceiveData:(NSData*)data mDevice:(DFBlunoDevice*)dev;
    

    问题来了:

    • 是什么原因导致 Xcode 强行将参数转换成小写字母开头呢(我已经在 playground 里测试过大写字母开头的函数参数是可行的)?
    • 有比更改 Objective-C 源代码更优的解决方法吗?
    6 条回复    2016-04-28 08:04:54 +08:00
    dorentus
        1
    dorentus  
       2016-04-27 19:17:38 +08:00 via iPhone
    你那个 objc 的方法命名不规范…

    要改的话,直接把 Device: 改成 device: 不就好了,又不是 C++

    clang 或许有什么属性标记支持自定义导给 swift 的名字的,我不知道
    IvanLing
        2
    IvanLing  
    OP
       2016-04-27 19:23:11 +08:00
    @dorentus 那个是硬件提供的 library...
    wanganjun
        3
    wanganjun  
       2016-04-27 22:15:26 +08:00   ❤️ 1
    -(void)didReceiveData:(NSData*)data Device:(NSObject*)dev NS_SWIFT_NAME(didReceiveData(_:Device:));
    wohenyingyu01
        4
    wohenyingyu01  
       2016-04-28 00:28:31 +08:00
    OC 本身就应该小写开头,写成 device
    skyline75489
        5
    skyline75489  
       2016-04-28 08:03:21 +08:00
    楼上 +1 ,大写是不规范的。要么就用楼上上的方法,自己写 NS_SWIFT_NAME 。
    skyline75489
        6
    skyline75489  
       2016-04-28 08:04:54 +08:00   ❤️ 1
    Objective-C 代码再往 Swift 转的时候用的是一个专门的 importer ,这个 importer 看来也是喜欢规范的命名,对于不规范的就改掉了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5428 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:37 · PVG 16:37 · LAX 00:37 · JFK 03:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.