Swift.Any as? CFType

Objective-C 의 API 를 Swift 로부터 사용할 때, 다음과 같이 옵션 항목을 Dictionary 형으로 지정하는 것이 자주 있다.
open class AVPlayerItemVideoOutput : AVPlayerItemOutput {

    public init(pixelBufferAttributes: [String : Any]? = nil)

}

보통 Swift 측에서 API 에 값을 던지는 분에는 아무것도 문제 없지만, 스스로 Any 에서 CoreFoundation 구체적으로는 ↑ 의 API 에 건네지는 [String : Any]AnyCFAllocator 로서 꺼내고 싶다.

보통 as?로 캐스트하면 좋을까?





🤔
이것을 알 수 있습니다 :



같은 CoreFoundation 유래의 형태에서도 CFString 이나 CFNumber 는 Swift 의 String 이나 Int 등에 as 로 안전하게 캐스트할 수 있으므로, 특히 곤란하지 않다.
let value: Any? = "🤔"

guard let string = value as? String else { return }

let cfString = string as CFString

다만 CFAllocator 등은 대응하는 Swift나 Objective-C의 형태가 없기 때문에, 무엇인가 다른 수단으로 형태를 제대로 확인하고 나서 as! 로 캐스트하게 된다.

CFGetTypeID(_:)로 형식 확인



그래서 :
let value: Any? = attributes[kCVPixelBufferMemoryAllocatorKey as String]

let allocator: CFAllocator?

if CFGetTypeID(value as CFTypeRef!) == CFAllocatorGetTypeID() {
    allocator = (value as! CFAllocator)
} else {
    allocator = nil
}

이제 Any에서 CFAllocator로 캐스팅 할 수있었습니다. CFGetTypeID(_:) 에는 Swift 의 형태를 던져도 예외로 멈추는 일은 없기 때문에 , 형태의 일치 판정에 사용하는 분에는 문제 없을 것 같다.

참고

좋은 웹페이지 즐겨찾기