Last active
July 10, 2024 16:04
-
-
Save pookjw/1ec5fe17a3c2cda2c27f9cc560849573 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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