Guest User

Untitled

a guest
Nov 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. func whatever(foo: @autoclosure () -> Int) {
  2. let x = foo()
  3. print(x)
  4. }
  5.  
  6. whatever(foo: 5)
  7. // prints: 5
  8.  
  9. whatever(foo: { 5 })
  10. // Error: Function produces expected type 'Int'; did you mean to call it with '()'?
  11.  
  12. struct Defaults {
  13.  
  14. static var dispatcher: Defaults = ...
  15.  
  16. subscript<T>(setting: Setting<T>) -> T { ... }
  17.  
  18. struct Setting<T> {
  19. let key: String
  20. let defaultValue: () -> T
  21.  
  22. init(key: String, defaultValue: @escaping @autoclosure () -> T) {
  23. self.key = key
  24. self.defaultValue = defaultValue
  25. }
  26. }
  27. }
  28.  
  29. extension Defaults.Setting {
  30. static var nickname: Defaults.Setting<String> {
  31. return Defaults.Setting(key: "__nickname", defaultValue: "Angela Merkel")
  32. }
  33. }
  34.  
  35. // Usage:
  36. Defaults.dispatcher[.nickname] = "Emmanuel Macron"
  37.  
  38. extension Defaults.Setting {
  39. var withHashedKey: Defaults.Setting<T> {
  40. return Defaults.Setting(key: key.md5(), defaultValue: defaultValue)
  41. // Error: Cannot convert return expression of type 'Defaults.Setting<() -> T>' to return type 'Defaults.Setting<T>'
  42. }
  43. }
  44.  
  45. extension Defaults.Setting {
  46. init(key: String, defaultValue: @escaping () -> T) {
  47. self.init(key: key, defaultValue: defaultValue)
  48. }
  49. }
Add Comment
Please, Sign In to add comment