在Obj-C中是否可以使用Swift的枚举类型?

17 浏览
0 Comments

在Obj-C中是否可以使用Swift的枚举类型?

我正在尝试将一些Obj-C类转换为Swift。而在转换后的类中,还有一些其他的Obj-C类仍然在使用枚举。我在预发布文档中搜索了一下,但没有找到相关内容,可能是我漏掉了。是否有办法在Obj-C类中使用Swift枚举?或者有关这个问题的文档链接吗?

这是我在旧的Obj-C代码和新的Swift代码中声明枚举的方式。

我的旧Obj-C代码:

typedef NS_ENUM(NSInteger, SomeEnum)

{

SomeEnumA,

SomeEnumB,

SomeEnumC

};

@interface SomeClass : NSObject

...

@end

我的新Swift代码:

enum SomeEnum: NSInteger

{

case A

case B

case C

};

class SomeClass: NSObject

{

...

}

更新:根据答案,旧版本的Swift(1.2之前)无法实现这一点。但根据官方的Swift博客,在Swift 1.2中(与XCode 6.3一同发布),你可以通过在enum前面添加@objc来在Objective-C中使用Swift枚举。

0
0 Comments

问题的出现原因是Swift的Enum不能在Objective-C类中使用。解决方法是在Objective-C中声明枚举,并让两种语言共享它。从Xcode 6.3 / Swift 1.2起,Swift的Enum也可以在Objective-C中使用,只需要用将其包裹起来。需要注意的是,如果Swift的Enum使用了Int作为原始值类型,则可以在Objective-C中使用,但如果使用了其他原始值类型(如String),则不能在Objective-C中使用。

0
0 Comments

在Swift版本1.2(Xcode 6.3)中,可以在Objective-C中使用。只需在enum声明前加上public关键字,并将enum绑定为Int类型。然而,这种方法无法适用于包含关联值的String类型的enum。

在Objective-C中,使用Swift的enum需要将enum声明为指定的类型,然后在switch语句中使用相应的enum值。需要注意的是,在Objective-C中调用Swift的enum值时,需要添加enum名称作为前缀。

如果想在Swift Objective-C头文件中使用enum,可以将enum添加到自己的头文件中,并在桥接头文件中导入该头文件。

如果想在Objective-C++的初始化文件中传递Swift的enum实例,需要将enum添加到头文件中,并在桥接头文件中导入-Swift.h文件。

需要注意的是,这种方法只适用于整数类型的enum,无法适用于String类型的enum。

在使用这种方法时,可能会遇到未声明标识符的问题,可能是由于循环导入引起的。

总结起来,可以通过在enum声明前添加public关键字,并将enum绑定为Int类型,在Objective-C中使用Swift的enum。但是,这种方法不适用于String类型的enum。要在Objective-C++的初始化文件中使用Swift的enum实例,需要将enum添加到头文件中,并在桥接头文件中导入-Swift.h文件。

0
0 Comments

在使用Swift的Enum在Objective-C中的问题中,主要问题是如何在Swift和Objective-C之间共享Swift风格的枚举。解决方法是使用NS_ENUM()在Objective-C上下文中定义枚举,并通过Swift点表示法提供访问。

在Objective-C中,可以使用NS_ENUM()定义枚举:

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
};

在Swift中,可以使用Swift点表示法访问枚举:

let cellStyle: UITableViewCellStyle = .Default

然而,在某些情况下,可能会出现问题,比如在Swift中使用Objective-C的枚举时,可能会出现"function definition is not allowed here"的错误。解决方法是确保使用了正确的命名,并且在Swift 1.2版本之后,可以在Swift中定义枚举并在Objective-C中使用。

另外,还发现在Swift中使用Objective-C的枚举时存在一个问题,即它们不可失败。在使用MyEnum(rawValue: 12345)这样的代码片段时,如果12345不是枚举的一部分,结果将不是可选类型,而是一些无效的枚举。

总结起来,要在Swift和Objective-C之间共享Swift风格的枚举,可以使用NS_ENUM()在Objective-C上下文中定义枚举,并通过Swift点表示法访问。在Swift 1.2版本之后,还可以在Swift中定义枚举并在Objective-C中使用。然而,使用Objective-C的枚举时需要注意它们不可失败的特性。

0