将Objective-C枚举值转换为Swift枚举

时间:2018-11-15 12:54:24

标签: objective-c swift swift4.2

在您对这个问题进行表决之前,我想说一下我想做的是多么愚蠢。也许我还是不太理解枚举。

因此,我正在研究一个使用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;

2 个答案:

答案 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错误。

  

原始价值分配→=原始价值文字

     

原始值文字→数字文字|静态字符串文字|布尔文字

因此,仅数字(-70x100b010等数字),静态字符串(带引号的字符,例如"foo")和布尔值({{1} }或true文字

其他任何方法都行不通。