我有这个带有 String
值的枚举,它将用于告诉API方法,该方法会向服务器记录消息所具有的服务器类型 . 我正在使用Swift 1.2,因此枚举可以映射到Objective-C
@objc enum LogSeverity : String {
case Debug = "DEBUG"
case Info = "INFO"
case Warn = "WARN"
case Error = "ERROR"
}
我收到了错误
@objc enum raw type String不是整数类型
我没有设法找到任何说只有整数可以从Swift转换为Objective-C的地方 . 是这样的吗?如果是这样,有没有人有任何关于如何在Objective-C中提供这样的东西的最佳实践建议?
9 回答
来自Xcode 6.3 release notes(重点补充):
其中一个解决方案是使用RawRepresentable协议 .
编写init和rawValue方法并不理想,但允许您像往常一样在Swift和Objective-C中使用此枚举 .
这是一个有效的解决方案 .
如果你真的想实现这个目标,这就是解决方法 . 但是,您可以访问Objective C接受的对象中的枚举值,而不是实际的枚举值 .
致电:
Xcode 8的代码,使用
Int
工作的事实,但其他方法没有暴露给Objective-C . 这是非常可怕的,因为它...如果您不介意在(Objective)C中定义值,可以使用
NS_TYPED_ENUM
宏在Swift中导入常量 .例如:
.h file
.m file
在Swift中,这是作为
struct
导入的:尽管该类型没有被桥接为
enum
,但在Swift代码中使用它时感觉非常类似 .您可以在Using Swift with Cocoa and Objective-C documentation的"Interacting with C APIs"中阅读有关此技术的更多信息 .
这就是我想出来的 . 在我的例子中,这个枚举是在上下文中提供特定类的信息,
ServiceProvider
.从Swift,你可以在枚举上使用
.string
(类似于.rawValue
) . 从Objective-C,您可以使用[ServiceProvider FieldNameToString:enumValue];
您可以创建私有
Inner
枚举 . 实现有点可重复,但清晰简单 . 1行rawValue
,2行init
,总是看起来一样 .Inner
有一个返回"outer"等效的方法,反之亦然 .有一个额外的好处,你可以直接将枚举案例映射到
String
,这与其他答案不同 .如果您知道如何使用模板解决重复性问题,请立即 Build 此答案,我现在没有时间与它混在一起 .
这是我的用例:
我尽可能避免使用硬编码的字符串,这样当我改变某些内容时我会收到编译警告
我有一个来自后端的固定String值列表,也可以是nil
这是我的解决方案,根本不涉及硬编码字符串,支持缺失值,并且可以在Swift和Obj-C中优雅地使用: