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

2022-04-17 22:29:42 +08:00
 ShikiSuen

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

我不知道我哪里有搞错。

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

6248 次点击
所在节点    iDev
14 条回复
DianQK
2022-04-17 22:37:10 +08:00
用 typedef 定义 struct ,或者底下的函数签名改为 `struct XX` 试试
DianQK
2022-04-17 22:38:39 +08:00
大概长这样
typedef struct S {
int x;
} S;

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

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

@ysc3839 #6:不过默认也不会用 Objective-C++
ShikiSuen
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
2022-04-18 02:01:53 +08:00
shawndev
2022-04-18 09:53:26 +08:00
基础的 C 问题,类型是 struct SomeType ,而不是 SomeType ,一般的做法是 typedef struct SomeType {...} SomeType_t, *p_SomeType_t 。
liuidetmks
2022-04-18 11:45:14 +08:00
还有人跳坑 oc? 看帖子, 我认为原生开发的末日已经来了
xing7673
2022-04-20 11:31:37 +08:00
@liuidetmks 不学 oc 的话和 c++ interop 只能用 c 来 wrap 了。
xing7673
2022-04-20 11:44:28 +08:00
@liuidetmks 不过刚去刷了一下,interop 进展还可以,未来应该不用学 oc 了。
ShikiSuen
2022-05-02 00:25:20 +08:00
@xing7673 Swift 的 Enum Namespace 以及 Structs 可以給 C 直接用嗎?

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

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

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

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

© 2021 V2EX