CGImagePropertyOrientation -> UIImage.Orientation に変換するコードを、ドキュメントを基に以下のように実装した。
extension UIImage.Orientation {
init(_ cgOrientation: CGImagePropertyOrientation) {
switch cgOrientation {
case .up:
self = .up
case .upMirrored:
self = .upMirrored
case .down:
self = .down
case .downMirrored:
self = .downMirrored
case .left:
self = .left
case .leftMirrored:
self = .leftMirrored
case .right:
self = .right
case .rightMirrored:
self = .rightMirrored
}
}
}
コンパイラはエラーも警告も出さない。
CGImagePropertyOrientation
には @frozen
が指定されており、仕様上 @unknown default
も不要だ。
そう思っていた時期がありました
_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> Fatal error: unexpected enum case 'CGImagePropertyOrientation(rawValue: 0)' <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
CGImagePropertyOrientation
Xcode 13.2.1 (13C100) における CGImagePropertyOrientation
@frozen public enum CGImagePropertyOrientation : UInt32 {
case up = 1
case upMirrored = 2
case down = 3
case downMirrored = 4
case leftMirrored = 5
case right = 6
case rightMirrored = 7
case left = 8
}
CGImagePropertyOrientation
の要素は固定になっているはずだが、rawValue UInt32
から変換される経路によって Fatal error が発生しているようだ。
CGImagePropertyOrientation
は 1 ~ 8 の範囲を指定することを想定した設計になっているが、カメラアプリによっては今回の "0" のように、範囲外の値を指定してる可能性がある。
回避策
仕方ないので、回避策として default
を埋めておくことにする。
変更しても、コンパイラからエラーと警告は出ない。
extension UIImage.Orientation {
init(_ cgOrientation: CGImagePropertyOrientation) {
switch cgOrientation {
case .up:
self = .up
case .upMirrored:
self = .upMirrored
case .down:
self = .down
case .downMirrored:
self = .downMirrored
case .left:
self = .left
case .leftMirrored:
self = .leftMirrored
case .right:
self = .right
case .rightMirrored:
self = .rightMirrored
default:
self = .up
}
}
}
まとめ
Swift の enum だからといって、網羅性に100%の安心ができるかは、ケースによりますね。
みなさまもお気をつけください。
それでは、よいお年を 🐮 🔜 🐯.
UIImage.Orientation
-> CGImagePropertyOrientation
の変換はこう
extension CGImagePropertyOrientation {
init(_ uiOrientation: UIImage.Orientation) {
switch uiOrientation {
case .up:
self = .up
case .upMirrored:
self = .upMirrored
case .down:
self = .down
case .downMirrored:
self = .downMirrored
case .left:
self = .left
case .leftMirrored:
self = .leftMirrored
case .right:
self = .right
case .rightMirrored:
self = .rightMirrored
@unknown default:
self = .up
}
}
}