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)
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枚举.
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)
Swift 4.1,Xcode 9.4.1:
1)Swift枚举必须以前缀@objc并Int输入:
// 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)
| 归档时间: |
|
| 查看次数: |
60231 次 |
| 最近记录: |