选项1:
typedef NSString MyString
选项2:
typedef NSString * MyString
在Objective-C中,这两种说法都是有效的,但是从我看到的人看来,人们绝大多数选择选项2而不是选项1.是否存在技术原因,或者它更像是一种约定?
选项2隐藏了MyString
是指针的事实。这可能是意图,但在目标-c中,您通常想知道您是在处理原始类型还是引用类型。
在C中,至少约定是给它一个像MyStringRef
这样的名称来强调它是一个指针,但我认为我从未见过有人在objective-c中做过这样的事。
然后就是斯威夫特。
当桥接到swift时,选项1和选项2都可以正常工作,但是如果我尝试将option1标记为枚举 -
typedef NSString MyString NS_STRING_ENUM;
FOUNDATION_EXPORT MyString * const MyStringOne;
编译器开始吓坏了。语法高亮和自动完成会一直中断。像var x = MyString.one
这样的东西会直接扼杀编译器,只留下 Segmentation fault:11 错误。
答案 0 :(得分:1)
在Objective-C中声明“字符串枚举”时,使用此模式是正确的。
您问为什么在*
中加入typedef
是首选。
通常原因只是主观偏好之一,两种方法都是有效的。请注意,Core Foundation使用CFStringRef
等类型名称,其中*
被隐藏,但名称包含Ref
以表明这一点,但Objective-C不遵循并使用NSStringRef
但是你发现目标的理由遵循通常的模式 - Swift编译器(至少在我使用的Xcode 8.2.1和你使用过的那个)是一个敏感的生物并且自我炒作如果使用其他模式,则会出现内存故障。
首先向Apple提交一个错误(如果你有的话,先在Xcode 9中测试)。
然后坚持使用“首选”模式,除非您喜欢观看Swift commit compilercide; - )