SwiftUI에서 PhotosPicker로 UIImage 쉽게 불러오기(feat. Transferable)

Kang Hee Young·2025년 3월 21일

SwiftUI에서 PhotosPicker로 UIImage 쉽게 불러오기 – Transferable 커스텀 타입 활용하기

SwiftUI 4.0(iOS 16+)부터 도입된 PhotosPicker는 사용자가 사진을 고를 수 있게 해주는 아주 편리한 UI 컴포넌트입니다.
그런데 사진을 불러오는 과정에서 UIImage로 바로 변환하고 싶을 때 loadTransferable(type:) 메서드가 조금 까다롭게 느껴질 수 있어요.

이 포스트에서는 Transferable을 따르는 커스텀 타입을 만들어서 UIImage를 손쉽게 불러오는 방법을 소개할게요.


❗️문제 상황: UIImage는 Transferable을 따르지 않는다

기본적으로 다음과 같은 코드를 짜면 오류가 발생합니다.

let image = try await item.loadTransferable(type: UIImage.self) // ❌ 에러!

그 이유는 UIImageTransferable 프로토콜을 채택하지 않기 때문입니다.
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 DataUIImage로 변환
  • 변환에 성공하면 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 이상에서 사용할 수 있습니다.
추가로 이미지 리사이징, 압축, 썸네일 처리 등도 함께 다루면 더욱 완성도 높은 구현이 가능해요.

profile
hekang in 42Seoul.

0개의 댓글