Apple объявила , что с ARKit 3 (iOS 13) ARPlaneAnchor.Classification
получает два новых значения:
Мой проект ориентирован на 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" какдо. Любые предложения о том, как заставить это работать?