Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.77 KB | None | 0 0
  1. struct OpaqueExistentialContainer {
  2.  
  3. var fixedSizeBuffer0: UInt
  4. var fixedSizeBuffer1: UInt
  5. var fixedSizeBuffer2: UInt
  6. var metadata: UnsafeRawPointer
  7. var witnessTable: UnsafeRawPointer
  8. }
  9.  
  10. protocol P {}
  11.  
  12. extension P {
  13.  
  14. func test() -> String { return "TEST" }
  15. }
  16.  
  17. struct A : P {
  18.  
  19. var v1: Int64
  20. var v2: Int64
  21. }
  22.  
  23. let pa = A(v1: 1, v2: 2) as P
  24. let containerPA = unsafeBitCast(pa, to: OpaqueExistentialContainer.self)
  25.  
  26. containerPA.fixedSizeBuffer0 // 1(おそらく v1 の値)
  27. containerPA.fixedSizeBuffer1 // 2(おそらく v2 の値)
  28. containerPA.fixedSizeBuffer2 // 不定(おそらく未使用)
  29. unsafeBitCast(containerPA.metadata, to: Any.Type.self) // A.Type(復元できたはず)
  30. containerPA.witnessTable.debugDescription // 0x000000010e17ebc0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement