SwiftUI 4.0(iOS 16+)부터 도입된 PhotosPicker는 사용자가 사진을 고를 수 있게 해주는 아주 편리한 UI 컴포넌트입니다.
그런데 사진을 불러오는 과정에서 UIImage로 바로 변환하고 싶을 때 loadTransferable(type:) 메서드가 조금 까다롭게 느껴질 수 있어요.
이 포스트에서는 Transferable을 따르는 커스텀 타입을 만들어서 UIImage를 손쉽게 불러오는 방법을 소개할게요.
UIImage는 Transferable을 따르지 않는다기본적으로 다음과 같은 코드를 짜면 오류가 발생합니다.
let image = try await item.loadTransferable(type: UIImage.self) // ❌ 에러!
그 이유는 UIImage가 Transferable 프로토콜을 채택하지 않기 때문입니다.
Swift는 해당 타입이 어떤 방식으로 데이터를 주고받을지 알 수 없어요.
Transferable 타입 만들기이 문제를 해결하려면 우리가 직접 Transferable을 따르는 구조체를 만들면 됩니다.
아래는 UIImage를 담을 수 있는 PhotoTransfer라는 구조체예요:
import SwiftUI
import PhotosUI
import UniformTypeIdentifiers
struct PhotoTransfer: Transferable {
let image: UIImage
static var transferRepresentation: some TransferRepresentation {
DataRepresentation(importedContentType: .image) { data in
guard let image = UIImage(data: data) else {
throw NSError(domain: "Invalid image", code: 0)
}
return PhotoTransfer(image: image)
}
}
}
.image 타입으로 들어온 raw Data를 UIImage로 변환PhotoTransfer(image:)를 생성이제 정말 간단하게 사용할 수 있습니다:
if let photo = try await item.loadTransferable(type: PhotoTransfer.self) {
let image = photo.image
// image를 활용해 뷰에 띄우거나, Data로 변환할 수 있어요.
}
필요하다면 아래와 같이 JPEG 데이터로 바꾸는 것도 가능하죠:
let imageData = photo.image.jpegData(compressionQuality: 0.8)
이런 식으로 커스텀 Transferable 타입을 정의해두면,
PhotosPickerItem에서 UIImage로의 변환이 훨씬 직관적이고 안전해집니다.
코드도 깔끔해지고, 에러 처리도 명확해지죠.
SwiftUI를 사용해 사진 관련 기능을 구현할 때 꼭 한번 활용해보세요!
💡 참고로 이 방식은 iOS 16 이상에서 사용할 수 있습니다.
추가로 이미지 리사이징, 압축, 썸네일 처리 등도 함께 다루면 더욱 완성도 높은 구현이 가능해요.