Swift/@available(*, unavailable)でprotocolの準拠を剥がす
環境
code:sh
$swift --version
swift-driver version: 1.87.1 Apple Swift version 5.9 (swiftlang-5.9.0.128.108 clang-1500.0.40.1)
Target: arm64-apple-macosx14.0
モチベーション
swift-bookでSendableを無効にする記述が紹介されていて、初見だったのでメモ
code:swift
struct FileDescriptor {
let rawValue: CInt
}
@available(*, unavailable)
extension FileDescriptor: Sendable { }
/icons/hr.icon
code:swift
import Foundation
protocol Animal: Identifiable {}
// ❌ コンパイルエラー: Conformance of 'Dog' to 'Identifiable' is unavailable
class Dog: Animal {
var id: UUID { UUID() }
}
@available(*, unavailable)
extension Dog: Identifiable {}
let dog: some Animal = Dog()
Sendableのための特殊な処理かと思っていたけど、そんなことはなくSendable以外でも使えた
Sendable以外では使わないかな?
自身が直接コントロールできないサードパーティのSDKなどで、publicな型に対して何かしらのprotocolの準拠をやめたい時?
剥がす、というよりはextensionで準拠をunavailableにオーバーライドしている、が表現としてより良さそう