Значение перечисления Objective C в перечисление Swift - PullRequest
0 голосов
/ 15 ноября 2018

Перед тем, как проголосовать по этому вопросу, я хотел бы узнать, насколько глупым я пытаюсь заниматься Может быть, я до сих пор не понимаю правильно перечисления.

Итак, я работаю над проектом, в котором используется среда 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

Спасибо.

EDIT Функция, которая взаимодействует с функциями 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 голосов
/ 15 ноября 2018

Пять псевдонимов размера имеют (необработанные) значения 1, 3, 6, 7, 8, поэтому объявляйте перечисление Swift

enum GNImageSize : Int {
    case thumbnail = 1
    case small     = 3
    case medium    = 6
    case large     = 7
    case xLarge    = 8
}

Чтобы использовать значение Int в Swift, используйте, например,

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 все еще используют синтаксис каменного века typedef enum : NSInteger { ... } Foo;, а не синтаксис, совместимый со Swift typedef NS_ENUM (NSInteger, Foo) { ... }; Последний синтаксис существует в течение 6 лет (iOS 6, macOS 10.8).

0 голосов
/ 15 ноября 2018

Это raw-value style enum grammar ошибка.

raw-value-assignment → = raw-value-literal

raw-value-literal → numeric-literal | static-string-literal | логическое_выражение буквальное

Итак, только числовые (числа, такие как -7, 0x10, 0b010), статическая строка (символы в кавычках, такие как "foo") и логические (true или false) литералы разрешено там.

Все остальное не будет работать.

...