Как удалить неподдерживаемые случаи перечисления ARPlaneAnchor.Classification при работе на iOS 12? - PullRequest
1 голос
/ 15 октября 2019

Apple объявила , что с ARKit 3 (iOS 13) ARPlaneAnchor.Classification получает два новых значения:

enter image description here

Мой проект ориентирован на iOS 12.1.

В моем приложении есть следующий код:

extension ARPlaneAnchor.Classification {
    var description: String {
        switch self {
        case .wall:
            return "Wall"
        case .floor:
            return "Floor"
        case .ceiling:
            return "Ceiling"
        case .table:
            return "Table"
        case .seat:
            return "Seat"
        case .window:
            return "Window"
        case .door:
            return "Door"
        case .none(.unknown):
            return "Unknown"
        default:
            return ""
        }
    }
}

Когда я пытаюсь запустить его на iPhone X с iOS 13, он работает нормально ивыполняет путь к коду для window и door.

Когда я пытаюсь запустить его на iPhone 8 под управлением iOS 12.4, при запуске происходит сбой:

dyld: Symbolне найдено: _ $ sSo13ARPlaneAnchorC5ARKitE14ClassificationO4dooryA2EmFWC
Ссылка на: /var/containers/Bundle/Application/...
Ожидается в: /usr/lib/swift/libswiftARKit.dylind / var / var/Application/...

Ключевые слова для поиска: ARPlaneAnchor ARKit Classification door

Если я закомментирую case door и case window, он будет запущен простоотлично.

Это, очевидно, ошибка в том, что случаи перечисления для door и window доступны только на iOS 13.

Когда я нажимаю на определение команды, я вижу, что Apple определила его следующим образом:

/**
 A value describing the classification of a plane anchor.
 */
@available(iOS 12.0, *)
public enum __ARPlaneClassification : Int {


    /** The classification is not any of the known classes. */
    case none

    /** The classification is not any of the known classes. */
    case wall

    /** The classification is not any of the known classes. */
    case floor

    /** The classification is not any of the known classes. */
    case ceiling

    /** The classification is not any of the known classes. */
    case table

    /** The classification is not any of the known classes. */
    case seat

    /** The classification is not any of the known classes. */
    case window

    /** The classification is not any of the known classes. */
    case door
}

или иногда это выглядит так:

@available(iOS 12.0, *)
extension ARPlaneAnchor {

    public enum Classification {

        // ...

        /** The classification is not any of the known classes. */
        case none(ARPlaneAnchor.Classification.Status)

        case wall

        case floor

        case ceiling

        case table

        case seat

        case window

        case door
    }

    public var classification: ARPlaneAnchor.Classification { get }
}

Как вы можетесм. в обоих примерах, новое перечисление iOS 13 (например, door) выглядит точно так же, как и старое перечисление iOS 12 (например, wall). Я полагаю, что именно из-за этого он прекрасно компилируется, но при запуске вылетает.

Как заставить код нормально работать на обоих устройствах под управлением iOS 13 и iOS 12?


Обновление : я пытался использовать проверку доступности , такую ​​как:

extension ARPlaneAnchor.Classification {
    var description: String {
        if #available(iOS 13, *) {
            return description_13()
        } else {
            return description_12()
        }
    }

    @available(iOS 12, *)
    private func description_12() -> String {
        switch self {
        case .wall:
            return "Wall"
        case .floor:
            return "Floor"
        case .ceiling:
            return "Ceiling"
        case .table:
            return "Table"
        case .seat:
            return "Seat"
        case .none(.unknown):
            return "Unknown"
        default:
            return ""
        }
    }

    @available(iOS 13, *)
    private func description_13() -> String {
        switch self {
        case .window:
            return "Window"
        case .door:
            return "Door"
        default:
            return description_12()
        }
    }
}

Однако это вывело ту же самую ошибку "Symbol not found" какдо. Любые предложения о том, как заставить это работать?

...