可以在Obj-C中使用Swift的Enum吗?

myL*_*dog 134 enums objective-c swift

我正在尝试将我的一些Obj-C类转换为Swift.还有一些其他的Obj-C类仍在转换类中使用枚举.我在Pre-Release Docs中搜索过但找不到它,或者我错过了它.有没有办法在Obj-C类中使用Swift枚举?或者链接到这个问题的文档?

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

我的旧Obj-C代码:

typedef NS_ENUM(NSInteger, SomeEnum)
{
    SomeEnumA,
    SomeEnumB,
    SomeEnumC
};

@interface SomeClass : NSObject

...

@end
Run Code Online (Sandbox Code Playgroud)

我的新Swift代码:

enum SomeEnum: NSInteger
{
    case A
    case B
    case C
};

class SomeClass: NSObject
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

更新:从答案.它不能在Swift旧版本1.2以上完成.但根据这个官方的Swift博客.在雨燕1.2与6.3的XCode一起发布的,您可以通过添加使用SWIFT的枚举Objective-C的@objc前面enum

Dan*_*sko 208

从Swift 1.2版(Xcode 6.3)开始,你可以.只需在enum声明前加上前缀即可@objc

@objc enum Bear: Int {
    case Black, Grizzly, Polar
}
Run Code Online (Sandbox Code Playgroud)

无耻地从Swift博客中获取


在Objective-C中,这看起来像

Bear type = BearBlack;
switch (type) {
    case BearBlack:
    case BearGrizzly:
    case BearPolar:
       [self runLikeHell];
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你指出它...请注意,在objective-c中,枚举值将被称为"BearBlack","BearGrizzly"和"BearPolar"! (6认同)
  • 是的,这有效。然而,至少在我的例子中,必须将“public”属性添加到枚举中,以便在项目的 Objective-C 端可以访问它,如下所示:“@objc public enum Bear: Int” (2认同)
  • @AJit为什么要这么做?只需将枚举添加到其自己的标头中,然后将其导入到桥接标头中,否则它是Swift专有的 (2认同)

hpi*_*que 31

使用Swift with Cocoa和Objective-C指南:

必须使用@objc属性标记Swift类或协议才能在Objective-C中访问和使用.[...]

只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容.这不包括仅限Swift的功能,例如此处列出的功能:

在Swift /结构中定义的Swift/Structures中定义的Swift/Result中的Tuples/Enumerations在Swift中定义的Swift/Global变量/在Swift/Swift风格的变量中定义的Typealases /嵌套类型/ Curried函数

所以,不,你不能在Objective-C类中使用Swift枚举.

  • 这个答案不再有效!! 从Xcode 6.3/Swift 1.2开始,Swift枚举也可以在objective-c中使用`@objc`,因为@DanielGalasko在下面的答案中指出了!!! (19认同)
  • 只是为了澄清上述评论,引用[Swift 2.1文档]上的当前文本(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html),"枚举"在Swift**中定义,没有Int原始值类型**".因此,如果您在Swift中的枚举声明为使用Int原始值类型,如`@obj enum MyEnum:Int`,它将在Objective-C文件中正常工作,如前所述.如果您的枚举声明使用另一个原始值类型,如`@obj enum MyOtherEnum:String`,您将无法在Objective-C文件上使用它 (8认同)
  • @RaulLopezVillalpando如果您知道要与Objective-C进行互操作,那么您应该在Objective-C中声明枚举,并让两种语言共享它. (4认同)
  • 有解决方法吗?我的意思是,如果我创建一个Swift类并且我绝对需要一个枚举。我如何使该枚举也可用于Objective-C? (2认同)
  • "是的,所以我们建立了这座桥来帮助你过渡到Swift,但如果你想使用任何酷的东西,比如Enums,Structs,Generics ......那就没用了......所以那就是......" (2认同)

Sir*_*Nod 30

扩展选定的答案......

可以使用Swift和Objective-C之间共享Swift样式的枚举NS_ENUM().

它们只需要在Objective-C上下文中定义,NS_ENUM()并使用Swift点表示法提供它们.

来自使用Swift with Cocoa和Objective-C

Swift作为Swift枚举导入任何标有NS_ENUM宏的C风格枚举.这意味着枚举值名称的前缀在导入Swift时会被截断,无论它们是在系统框架中还是在自定义代码中定义的.

Objective-C的

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
};
Run Code Online (Sandbox Code Playgroud)

迅速

let cellStyle: UITableViewCellStyle = .Default
Run Code Online (Sandbox Code Playgroud)


lea*_*nne 6

Swift 4.1,Xcode 9.4.1:

1)Swift枚举必须以前缀@objcInt输入:

// in .swift file:
@objc enum CalendarPermission: Int {
    case authorized
    case denied
    case restricted
    case undetermined
}
Run Code Online (Sandbox Code Playgroud)

2)Objective-C名称是枚举名称+案例名称,例如CalendarPermissionAuthorized

// in .m file:
// point to something that returns the enum type (`CalendarPermission` here)
CalendarPermission calPermission = ...;

// use the enum values with their adjusted names
switch (calPermission) {
    case CalendarPermissionAuthorized:
    {
        // code here
        break;
    }
    case CalendarPermissionDenied:
    case CalendarPermissionRestricted:
    {
        // code here
        break;
    }
    case CalendarPermissionUndetermined:
    {
        // code here
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,当然,请记住将Swift桥接标头作为Objective-C文件的导入列表中的最后一项导入:

#import "MyAppViewController.h"
#import "MyApp-Swift.h"
Run Code Online (Sandbox Code Playgroud)