드래그 앤 드롭 또는 복사 및 붙여넣기와 같은 전송 API와 상호 작용하는 타입이 어떻게 작동하는지 설명하는 프로토콜입니다.
Transferable 프로토콜을 준수하기 위해서는 transferRepresentation 프로퍼티를 구현해야합니다. 다음 예제 처럼 이미지 편집 앱의 레이어 타입은 사용자가 문서 내에서 이미지 레이어를 드래그 앤 드롭하여 재정렬할 수 있도록 Transferable을 준수할 수 있습니다.
struct ImageDocumentLayer {
init(data: Data)
func data() -> Data
func pngData() -> Data
}
다음은 ImageDocumentLayer 를 Transferable 에 준수하도록 확장하는 방법입니다.
extension ImageDocumentLayer: Transferable {
static var transferRepresentation: some TransferRepresentation {
DataRepresentation(contentType: .layer) { layer in
layer.data()
}, importing: { data in
try Layer(data: data)
}
DataRepresentation(exportedContentType: .png) { layer in
layer.pngData()
}
}
사용자가 앱 내에서 레이어를 드래그 앤 드롭하거나 사용자 지정 레이어 콘텐츠 유형을 인식하는 다른 앱으로 레이어를 드래그 앤 드롭할 때, 앱은 첫 번째 표현을 사용합니다. 레이어를 다른 이미지 편집기로 끌어다 놓으면 해당 편집기가 PNG 파일 유형을 인식할 가능성이 높습니다. 두 번째 전송 표현을 PNG 파일에 대한 지원을 추가합니다.
extension UTType {
static var layer: UTType { UTType(exportedAs: "com.example.layer") }
}
중요
만약 앱이 사용자 지정 균일 유형 식별자를 선언하는 경우, 앱의 Info.plist 에 해당 항목을 포함합니다. 자세한 내용은 Defining file and data types for your app 를 참고합니다.
만일 기존에 타입 중 하나가 Codable 을 준수하는 경우, Transferable은 자동으로 Data로의 변환을 처리합니다. 다음은 Codable을 준수하는 간단한 Codable을 준수하는 간단한 Note 구조체를 선언하고 Transferable로 만드는 extension입니다.
struct Note: Codable {
let title: String
let body: String
}
extension Note: Transferable {
static var transferRepresentation: some TransferRepresentation {
CodableRepresentation(contentType: .note)
}
}
사용자 지정 노트 유형에 대해 알지 못하는 다른 앱과의 호환성을 보장하기 위해 다음은 노트를 텍스트로 변환하는 추가적인 전송 표현을 추가합니다.
extension Note: Transferable {
static var transferRepresentation: some TransferRepresentation {
CodableRepresentation(contentType: .note)
ProxyRepresentation(\.title)
}
}
전송 표현에서의 표현의 순서는 중요하므로 타입을 가장 정확하게 나타내는 표현을 먼저 놓고 다음에 덜 선호되는 표현의 순서를 놓습니다.
'SwiftUI' 카테고리의 다른 글
TapGesture (0) | 2024.01.06 |
---|---|
RotateGesture (0) | 2024.01.06 |
PhotosPicker (0) | 2023.12.22 |
Shapes ( Rectangle, RoundedRectangle, Circle, Ellipse, Capsule ...) (0) | 2023.12.20 |
PreferenceKey Protocol (0) | 2023.12.19 |