我有一个定义的自定义错误域,我想在协议中发布。域在实现文件中定义如下:
//in the .m file
static void *MyErrorDomain = (void *)@"MyErrorDomain";
.h文件实现了一个协议,我也希望在那里发布MyErrorDomain。但是,我无法找出正确的形式。提供最少错误的是:
// in the protocol
static extern void * TBPluginErrorDomain;
Xcode错误是:“声明说明符中的多个存储类”。
我认为静态void构造将MyErrorDomain转换为一种函数,但是“static extern void TBPluginErrorDomain();”只增加了错误的数量。简而言之,我在无知的徘徊中徘徊,所有的指导都将受到高度赞赏。
答案 0 :(得分:2)
在顶层,static
表示“不能直接访问此文件(没有指针)”(文件范围)。 extern
表示“在某些其他目标文件中定义”。 static extern
没有任何意义。这就像要求从另一个类访问私有成员。您不想在此处使用static
。
只需在.m
中进行正常定义:
void *MyErrorDomain = @"MyErrorDomain";
在.h
:
extern void *MyErrorDomain;
每当您将使用该变量的内容(包括.o
文件之后)链接在一起时,请务必在.m
中链接.h
。在Xcode中,在.m
文件的“获取信息”窗口的“目标”选项卡中,请务必检查使用该变量的每个目标(在较新版本中可能略有不同,我的旧版本已经过时了!)。
您可以添加const
(const …
和extern const …
),但NSString实例是不可变的,因此并非完全必要。您可以将它变成const
指针,因此指针不能在运行时直接更改(不会丢弃const
ness)。您在定义中一起const void * const MyErrorDomain
。只需在声明中以extern
作为前缀。
此外,根据您的目的,您可以考虑使用NSString *
代替void *
。
答案 1 :(得分:0)
协议仅定义其他类要实现的方法的名称和参数。它们不包含任何数据或功能代码。
如果需要协议方法返回的自定义数据,则应定义一个提供数据的类,并使用该协议所需的方法之一返回该类的实例。这将迫使那些实现协议的人#import这个类。