Guest User

Untitled

a guest
Apr 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. public struct Person {
  2. public var firstName: String
  3. public var middleName: String?
  4. public var lastName: String
  5. public var ageInYears: Int
  6.  
  7. public var fullName: String {
  8. return [firstName, middleName, lastName].flatMap{ $0 }.joinWithSeparator(" ")
  9. }
  10. }
  11.  
  12. var john = Person(firstName: "John", middleName: nil, lastName: "Doe", ageInYears: 30)
  13.  
  14. /* Getting */
  15.  
  16. let firstNameState = john[.firstName] // Person.PropertyState.firstName("John")
  17. let ageInYearsState = john[.ageInYears] // Person.PropertyState.ageInYears(30)
  18. let fullNameState = john[.fullName] // Person.PropertyState.fullName("John Doe")
  19.  
  20. // Mutate ageInYears
  21. john.ageInYears = 80
  22. let ageInYearsState2 = john[.ageInYears] // Person.PropertyState.ageInYears(80)
  23.  
  24. /* Initializing keys from strings */
  25.  
  26. if let validKey = Person.Property(rawValue: "lastName") { // Person.Property.lastName
  27. // Get value
  28. let validKeyState = john[validKey] // Person.PropertyState.lastName("Doe")
  29. }
  30.  
  31. let invalidKey = Person.Property(rawValue: "nonExistant") // nil
  32.  
  33. /* Creating from arbitrary values */
  34.  
  35. if let
  36. validatedFirstName = Person.PropertyState(validating: "Bob", property: .firstName),
  37. validatedAgeInYears = Person.PropertyState(validating: 50, property: .ageInYears)
  38. {
  39. var bob = john
  40. // Make alterations
  41. validatedFirstName.set(&bob)
  42. validatedAgeInYears.set(&bob)
  43. print(bob) // Person(firstName: "Bob", middleName: nil, lastName: "Doe", ageInYears: 50)
  44. }
  45.  
  46. // Invalid values
  47. let failedFirstName = Person.PropertyState(validating: ["Not going to work"], property: .firstName) // nil
  48. let failedAgeInYears = Person.PropertyState(validating: "Expects an int", property: .ageInYears) // nil
  49.  
  50. /* Transfer from one to another */
  51.  
  52. var alice = Person(firstName: "Alice", middleName: nil, lastName: "Jones", ageInYears: 40)
  53. var susan = Person(firstName: "Susan", middleName: nil, lastName: "Smith", ageInYears: 20)
  54.  
  55. // Transfer lastName "Jones" from alice to susan
  56. alice[.lastName].set(&susan)
  57. print(susan) // Person(firstName: "Susan", middleName: nil, lastName: "Jones", ageInYears: 20)
  58.  
  59. // Attempt to transfer get-only fullName
  60. alice[.fullName].set(&susan) // Fatal error (not settable)
Add Comment
Please, Sign In to add comment