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

遇到了一个棘手的 OjbC 的问题

  •  
  •   ShikiSuen · 2022-04-17 22:29:42 +08:00 · 6212 次点击
    这是一个创建于 711 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 Header 里面定义了一个 Struct 资料类型, 然后直接就在 Header 里面声明某个函数的传回物件是这种资料类型。 结果 Xcode 靠北说「 expected a type 」。

    我不知道我哪里有搞错。

    荧幕撷图在此: https://weibo.com/1593745303/LoUuw1Z1N

    14 条回复    2022-05-02 00:25:20 +08:00
    DianQK
        1
    DianQK  
       2022-04-17 22:37:10 +08:00 via Android
    用 typedef 定义 struct ,或者底下的函数签名改为 `struct XX` 试试
    DianQK
        2
    DianQK  
       2022-04-17 22:38:39 +08:00 via Android   ❤️ 1
    大概长这样
    typedef struct S {
    int x;
    } S;

    或者
    -(struct BufferStateChange)xxx;
    Building
        3
    Building  
       2022-04-17 23:35:49 +08:00
    OC 还没有这么强大能在 struct 里面用对象吧,struct 只能用值类型和指针
    ShikiSuen
        4
    ShikiSuen  
    OP
       2022-04-18 00:00:48 +08:00
    @Building ... and Swift structs cannot be used in ObjC.
    AlphaRobert
        5
    AlphaRobert  
       2022-04-18 01:21:38 +08:00   ❤️ 3
    这并不是棘手 Objective-C 的问题,而是基础的 C 问题。

    如果你只用 `struct SomeType {...};` 定义结构体,那么你在表示该结构体类型时必须写为 `struct SomeType`,除非你定义时写 `typedef SomeType Type {...} SomeType;`。
    ysc3839
        6
    ysc3839  
       2022-04-18 01:32:31 +08:00
    @AlphaRobert 顺带一提,C++则不需要写完整的 struct SomeType ,可以直接用 SomeType
    AlphaRobert
        7
    AlphaRobert  
       2022-04-18 01:49:41 +08:00
    @AlphaRobert #5:`typedef SomeType {...} SomeType;` 里多打了个 `Type`,应该是

    @ysc3839 #6:不过默认也不会用 Objective-C++
    ShikiSuen
        8
    ShikiSuen  
    OP
       2022-04-18 02:00:42 +08:00
    @AlphaRobert 感谢指点迷津。
    我换了个更稳妥的方法来绕过了这个问题。
    我直接将原先的函数写成 ObjC++ 过程、将结果写入 objc 模组内的三个本地变数当中。
    这三个本地变数都有对应的取值函数。
    然后 Swift 那边先触发过程、再用取值函数取回数值。

    于是威注音输入法的 KeyHandler 的 Swift 化圆满完成。

    重写之前:
    KeyHandler.mm 1691 行。

    重写之后:
    KeyHandler.mm 605 行,仅包含只能由 ObjC++ 完成的部分;
    KeyHandler_HandleInput.swift 400 行。
    KeyHandler_HandleCandidate.swift 303 行。
    KeyHandler_Misc.swift 22 行。
    KeyHandler_States.swift 509 行。
    ShikiSuen
        9
    ShikiSuen  
    OP
       2022-04-18 02:01:53 +08:00
    shawndev
        10
    shawndev  
       2022-04-18 09:53:26 +08:00
    基础的 C 问题,类型是 struct SomeType ,而不是 SomeType ,一般的做法是 typedef struct SomeType {...} SomeType_t, *p_SomeType_t 。
    liuidetmks
        11
    liuidetmks  
       2022-04-18 11:45:14 +08:00
    还有人跳坑 oc? 看帖子, 我认为原生开发的末日已经来了
    xing7673
        12
    xing7673  
       2022-04-20 11:31:37 +08:00 via iPhone
    @liuidetmks 不学 oc 的话和 c++ interop 只能用 c 来 wrap 了。
    xing7673
        13
    xing7673  
       2022-04-20 11:44:28 +08:00 via iPhone
    @liuidetmks 不过刚去刷了一下,interop 进展还可以,未来应该不用学 oc 了。
    ShikiSuen
        14
    ShikiSuen  
    OP
       2022-05-02 00:25:20 +08:00
    @xing7673 Swift 的 Enum Namespace 以及 Structs 可以給 C 直接用嗎?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5543 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 06:05 · PVG 14:05 · LAX 23:05 · JFK 02:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.