Как создать функцию enum, которая возвращает кортеж Ints? - PullRequest
1 голос
/ 26 мая 2019

Добрый день всем.Я создаю enum, чтобы получить разрешение экрана, когда я предоставляю тип iDevice (номера размеров экрана здесь не соответствуют действительности).У меня есть код, работающий, когда я не использую функцию enum, но я бы предпочел использовать функцию enum, чтобы держать вещи в чистоте и вместе.Код, который у меня есть, для использования функции enum следующий:

enum iDeviceType {
    case iPhone(String)
    case iPad(String)
    ...

    func screenSize()->(Int,Int){
        var myModel: (Int, Int)

        switch ????? {
        case .iPhone(let model):
            switch model {
            case "XR" : myModel = (width: 400, height: 612)
            case "6" : myModel = (width: 465, height: 712)
            case "6Plus" : myModel = (width: 465, height: 912)
            ...
            default: myModel = (width: 365, height: 512)
            }

        case .iPad(let model):
            switch model {
            case "Air 1gen" : myModel = (width: 365, height: 512)
            case "Air 2gen" : myModel = (width: 405, height: 565)
            ...
            default: myModel = (width: 365, height: 512)
            }

        default:
            print("not an iOS device")
        }
        return myModel
    }

}

let myModel = iDeviceType.iPhone("XR").screenSize()
print(myModel.height)

Последние две строки кода - это способ, которым я хотел бы вызвать функцию enum иполучить результат обратно.

Что мне не хватает?Я попытался self, под вопросительными знаками, получить текущий iDeviceType, но не могу заставить его работать.

Какие-нибудь предложения, чтобы сделать это более ясным?Я использую Swift 5.

1 Ответ

1 голос
/ 26 мая 2019

Это работает с несколькими модификациями.Ключевой модификацией является указание типа возврата screenSize() как (width: Int, height: Int), чтобы можно было распаковать результат.

enum iDeviceType {
    case iPhone(String)
    case iPad(String)
    case other

    func screenSize() -> (width: Int, height: Int) {
        var myModel = (width: 0, height: 0)

        switch self {
        case .iPhone(let model):
            switch model {
            case "XR" : myModel = (width: 400, height: 612)
            case "6" : myModel = (width: 465, height: 712)
            case "6Plus" : myModel = (width: 465, height: 912)
            default: myModel = (width: 365, height: 512)
            }

        case .iPad(let model):
            switch model {
            case "Air 1gen" : myModel = (width: 365, height: 512)
            case "Air 2gen" : myModel = (width: 405, height: 565)
            default: myModel = (width: 365, height: 512)
            }

        default:
            print("not an iOS device")
        }
        return myModel
    }
}

let myModel = iDeviceType.iPhone("XR").screenSize()
print(myModel.height)

612


Создание screenSize вычисляемого свойства:

Поскольку вы ничего не передаете screenSize(), рассмотрите возможность сделать его вычисляемым свойством:

изменить:

func screenSize() -> (width: Int, height: Int) {

до:

var screenSize: (width: Int, height: Int) {

А затем получить к нему доступ так:

let myModel = iDeviceType.iPhone("XR").screenSize
...