Skip to content

Instantly share code, notes, and snippets.

@pookjw
Last active July 10, 2024 16:04
Show Gist options
  • Save pookjw/1ec5fe17a3c2cda2c27f9cc560849573 to your computer and use it in GitHub Desktop.
Save pookjw/1ec5fe17a3c2cda2c27f9cc560849573 to your computer and use it in GitHub Desktop.
extension Swift.Never: MyData {
var body: Never {
fatalError()
}
}
struct AnyData: MyData {
typealias Body = Never
private let __data: any MyData
init<V>(erasing data: V) where V : MyData {
self.__data = data
}
var body: Never {
fatalError()
}
}
@_typeEraser(AnyData) protocol MyData {
associatedtype Body : MyData
var body: Self.Body { get }
}
struct HelloData: MyData {
dynamic var body: some MyData {
fatalError("Never Called") // Never이어도 _dynamicReplacement에 의해 HelloData로 바뀌지만, _typeEraser으로 인해 AnyData라는 Type으로 고정
}
}
extension HelloData {
@_dynamicReplacement(for: body)
var _body: some MyData {
HelloData()
}
}
print(HelloData().body)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment