admin 发表于 2023-12-6 11:15:48

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

我在 Header 里面定义了一个 Struct 资料类型,
然后直接就在 Header 里面声明某个函数的传回物件是这种资料类型。
结果 Xcode 靠北说「 expected a type 」。
我不知道我哪里有搞错。
荧幕撷图在此: https://weibo.com/1593745303/LoUuw1Z1N

用 typedef 定义 struct ,或者底下的函数签名改为 `struct XX` 试试
大概长这样typedef struct S {int x; } S;或者-(struct BufferStateChange)xxx;
OC 还没有这么强大能在 struct 里面用对象吧,struct 只能用值类型和指针
@Building ... and Swift structs cannot be used in ObjC.
这并不是棘手 Objective-C 的问题,而是基础的 C 问题。如果你只用 `struct SomeType {...};` 定义结构体,那么你在表示该结构体类型时必须写为 `struct SomeType`,除非你定义时写 `typedef SomeType Type {...} SomeType;`。
@AlphaRobert 顺带一提,C++则不需要写完整的 struct SomeType ,可以直接用 SomeType
@AlphaRobert #5:`typedef SomeType {...} SomeType;` 里多打了个 `Type`,应该是@ysc3839 #6:不过默认也不会用 Objective-C++
@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 行。
感兴趣的可以看这个 commit: https://github.com/ShikiSuen/vChewing-macOS/commit/417c9ede7ed44373cf38c49a22a138c40e253d51
基础的 C 问题,类型是 struct SomeType ,而不是 SomeType ,一般的做法是 typedef struct SomeType {...} SomeType_t, *p_SomeType_t 。
还有人跳坑 oc? 看帖子, 我认为原生开发的末日已经来了
@liuidetmks 不学 oc 的话和 c++ interop 只能用 c 来 wrap 了。
@liuidetmks 不过刚去刷了一下,interop 进展还可以,未来应该不用学 oc 了。
@xing7673 Swift 的 Enum Namespace 以及 Structs 可以給 C 直接用嗎?
页: [1]
查看完整版本: 遇到了一个棘手的 OjbC 的问题