Run-time Polymorphism in Swift

This has come up several times on the forums, but I’ve never written it up in a standard place, so here it is: There are only three ways to get run-time polymorphism in Swift. Well, three and a half.


A few days ago Julia Evans posted this:

has anyone made a read-only FUSE filesystem for a git repository where every commit is a folder and the folder contains all the files in that commit?

the idea is that you could just run cd COMMIT_ID and poke around instead of checking out the commit

and maybe the branches could be symbolic links to the commit folders?

And I did in fact do something very like that, back when I was playing with FUSE! But I never put it up anywhere cause it had an annoying build process, and didn’t seem to add much, and—

There's No Such Thing As "Implicitly Atomic"

If I have an aligned machine-word-sized variable (Int) and I store to it from Thread A, then I know Thread B might see the old value instead of the new value (because of per-processor caching, or the compiler “hoisting” a load to earlier in the function). But there’s no way, on a modern processor, that Thread B sees a mix of the old and new value, right? That can only happen with wider values, or unaligned values, that the code may update non-atomically, right?

This question is paraphrased from the Swift forums, though I’m not linking to it cause it’s in the middle of a larger thread and it’s something people might reasonably ask anyway. My response, lightly edited, is below; it is Swift-oriented but also applies to C, C++, and Rust.

Older Posts

  1. 2023-01-22 Rescuing Files From Classic Mac OS...with Swift!
  2. 2022-11-28 The Two Faces of Codable/Serde
  3. 2022-10-09 Swift was always going to be part of the OS
  4. 2022-04-24 Default Arguments and Label-based Overloading
  5. 2021-12-31 Swift Regrets: Wrap-up
  6. 2021-12-30 Swift History: Assignment Methods
  7. 2021-12-28 Swift Regret: inout Syntax
  8. 2021-12-26 Swift Delight: Optional Conveniences
  9. 2021-12-23 Swift Regret: try?
  10. 2021-12-21 Swift Delight: try
  11. 2021-12-17 Swift Regret: Operator Function Lookup Rules
  12. 2021-12-15 Swift Regret: "Double" rather than "Float64"
  13. 2021-12-10 Swift Delight: Implicit Member Syntax
  14. 2021-12-08 Swift Regret: Weak Vars in Structs
  15. 2021-12-03 Swift Regret: Lazy Vars in Structs
  16. 2021-11-30 Swift Delight: No Unused Results
  17. 2021-11-24 Swift Regret: Open Protocols
  18. 2021-11-21 Swift Regret: Retroactive Conformances
  19. 2021-11-18 Swift Delight: Library Evolution
  20. 2021-11-10 Swift Mangling Regret: Private Discriminators
  21. 2021-11-05 Swift Mangling Regret: The "Old" Mangling
  22. 2021-11-03 Swift Mangling Regret: Library Evolution
  23. 2021-10-29 Swift Delight: #available
  24. 2021-10-22 Swift Regret: Implicitly-Hashable Payloadless Enums
  25. 2021-10-20 Swift Regret: Top-Level Decls in Script Mode
  26. 2021-10-15 Swift Delight: Names for Generic Parameters
  27. 2021-10-13 Swift Regret: Generic Parameters Aren't Members
  28. 2021-10-08 Swift Regret: OpaquePointer
  29. 2021-10-06 Swift Regret: Unannotated C Enums
  30. 2021-10-01 Swift Delight: Value Semantics Collections
  31. 2021-09-29 Swift Delight: guard
  32. 2021-09-24 Swift Regret: Inferred Property Types
  33. 2021-09-22 Swift Regret: Implicit Optional Initialization
  34. 2021-09-17 Swift Regret: Subscript Trailing Closures
  35. 2021-09-15 Swift Regret: Subscript Argument Label Rules
  36. 2021-09-10 Swift Regrets
  37. 2021-09-10 Swift Regret: Unapplied Instance Methods
  38. 2021-09-08 Swift Regret: Bound Methods
  39. 2021-08-29 Swift Regret: Type-based Overloading
  40. 2021-08-25 Swift Regret: AnyObject Dispatch
  41. 2021-08-20 Swift Regret: Labeled Tuple Elements
  42. 2021-08-18 Swift Regret: Tuples and Argument Lists
  43. 2021-08-13 Swift Regret: Sequence
  44. 2021-08-11 Swift Regret: mutating Protocol Methods vs. Classes
  45. 2021-08-06 Swift Regret: NSUInteger
  46. 2021-08-04 Swift Regret: Protocol Syntax
  47. 2020-10-20 The Swift Runtime: Enums
  48. 2020-10-06 The Swift Runtime: Class Metadata Initialization
  49. 2020-09-29 The Swift Runtime: Class Metadata
  50. 2020-09-21 The Swift Runtime: Uniquing Caches
  51. 2020-09-14 The Swift Runtime: Type Metadata
  52. 2020-09-07 The Swift Runtime: Type Layout
  53. 2020-08-31 The Swift Runtime: Heap Objects
  54. 2020-08-26 Objective-Rust
  55. 2020-07-07 Suffusion: Playing with Filesystems
  56. 2020-05-24 ROSE-8 on Mac OS 9
  57. 2020-04-01 Swift on Mac OS 9
  58. 2019-11-01 Leaving Apple
  59. 2018-04-03 "FIXME" Doesn't Always Mean "Fix Me"
  60. 2018-02-26 Many-to-Many Protocols
  61. 2017-09-07 The New Kingdom of Nouns

Possibly Related Tags