在您对这个问题进行表决之前,我想说一下我想做的是多么愚蠢。也许我还是不太理解枚举。
因此,我正在研究一个使用Obj-C框架的项目。该框架包含枚举:
typedef enum : NSInteger
{
kImageSizeUnknown = 0,
kImageSize75,
kImageSize110,
kImageSize170,
kImageSize220,
kImageSize300,
kImageSize450,
kImageSize720,
kImageSize1080,
/* Size aliases */
kImageSizeThumbnail = kImageSize75,
kImageSizeSmall = kImageSize170,
kImageSizeMedium = kImageSize450,
kImageSizeLarge = kImageSize720,
kImageSizeXLarge = kImageSize1080
} GnImageSize;
我希望以某种方式能够声明一个Swift枚举,该枚举返回Obj-C枚举的值(这可能是愚蠢的部分)。
我现在就是这样。
enum GNImageSize:Int, CaseIterable{
case thumbnail
case sizeSmall
func toGnImageSize() -> GnImageSize {
switch self {
case .thumbnail:
return kImageSizeThumbnail
case .sizeSmall:
return kImageSizeSmall
}
}
static func toGnImageSize(sizeType:GNImageSize) -> GnImageSize {
switch sizeType {
case .thumbnail:
return kImageSizeThumbnail
case .sizeSmall:
return kImageSizeSmall
}
}
}
但是我什么时候做:
enum GNImageSize:Int, CaseIterable{
case thumbnail = GnImageSize.kImageSizeThumbnail
case sizeSmall = GnImageSize.kImageSizeSmall
}
我收到以下错误消息:
Raw value for enum case must be a literal
谢谢。
编辑 与Obj-c函数通信的函数
func getArtworkURL(forImageType imageType:GNImageSize, shouldFindAlternatives:Bool, highQualityFirst:Bool)->URL?{
if let asset = coverArt()?.asset(GnImageSize(rawValue: imageType.rawValue)), let assetURL = asset.urlHttp(){
return URL(string:assetURL)
}
else{
if shouldFindAlternatives{
if highQualityFirst{
for size in GNImageSize.allCases.reversed(){
if let asset = coverArt()?.asset(GnImageSize(rawValue: size.rawValue)), let assetURL = asset.urlHttp(){
return URL(string:assetURL)
}
}
}
else{
for size in GNImageSize.allCases{
if let asset = coverArt()?.asset(GnImageSize(rawValue: size.rawValue)), let assetURL = asset.urlHttp(){
return URL(string:assetURL)
}
}
}
}
}
return nil
}
哪里
-(nullable GnAsset*) asset: (GnImageSize)imageSize;
答案 0 :(得分:2)
五个 size别名的(原始)值分别为1、3、6、7、8,因此声明一个Swift枚举
enum GNImageSize : Int {
case thumbnail = 1
case small = 3
case medium = 6
case large = 7
case xLarge = 8
}
例如要在Swift中使用Int
值
GNImageSize.thumbnail.rawValue
或者使用静态属性创建自定义枚举以映射类型
enum GNImageSize {
static let thumbnail = GnImageSize(0)
static let small = GnImageSize(3)
static let medium = GnImageSize(6)
static let large = GnImageSize(7)
static let xLarge = GnImageSize(8)
}
我不明白在2018年,ObjC框架仍然使用Stone-age语法typedef enum : NSInteger { ... } Foo;
而不是Swift兼容语法typedef NS_ENUM (NSInteger, Foo) { ... };
。后者的语法已经存在6年了(iOS 6,macOS 10.8)。
答案 1 :(得分:0)
那个raw-value style enum grammar
错误。
原始价值分配→=原始价值文字
原始值文字→数字文字|静态字符串文字|布尔文字
因此,仅数字(-7
,0x10
,0b010
等数字),静态字符串(带引号的字符,例如"foo"
)和布尔值({{1} }或true
)文字。
其他任何方法都行不通。