Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public struct Person {
- public var firstName: String
- public var middleName: String?
- public var lastName: String
- public var ageInYears: Int
- public var fullName: String {
- return [firstName, middleName, lastName].flatMap{ $0 }.joinWithSeparator(" ")
- }
- }
- var john = Person(firstName: "John", middleName: nil, lastName: "Doe", ageInYears: 30)
- /* Getting */
- let firstNameState = john[.firstName] // Person.PropertyState.firstName("John")
- let ageInYearsState = john[.ageInYears] // Person.PropertyState.ageInYears(30)
- let fullNameState = john[.fullName] // Person.PropertyState.fullName("John Doe")
- // Mutate ageInYears
- john.ageInYears = 80
- let ageInYearsState2 = john[.ageInYears] // Person.PropertyState.ageInYears(80)
- /* Initializing keys from strings */
- if let validKey = Person.Property(rawValue: "lastName") { // Person.Property.lastName
- // Get value
- let validKeyState = john[validKey] // Person.PropertyState.lastName("Doe")
- }
- let invalidKey = Person.Property(rawValue: "nonExistant") // nil
- /* Creating from arbitrary values */
- if let
- validatedFirstName = Person.PropertyState(validating: "Bob", property: .firstName),
- validatedAgeInYears = Person.PropertyState(validating: 50, property: .ageInYears)
- {
- var bob = john
- // Make alterations
- validatedFirstName.set(&bob)
- validatedAgeInYears.set(&bob)
- print(bob) // Person(firstName: "Bob", middleName: nil, lastName: "Doe", ageInYears: 50)
- }
- // Invalid values
- let failedFirstName = Person.PropertyState(validating: ["Not going to work"], property: .firstName) // nil
- let failedAgeInYears = Person.PropertyState(validating: "Expects an int", property: .ageInYears) // nil
- /* Transfer from one to another */
- var alice = Person(firstName: "Alice", middleName: nil, lastName: "Jones", ageInYears: 40)
- var susan = Person(firstName: "Susan", middleName: nil, lastName: "Smith", ageInYears: 20)
- // Transfer lastName "Jones" from alice to susan
- alice[.lastName].set(&susan)
- print(susan) // Person(firstName: "Susan", middleName: nil, lastName: "Jones", ageInYears: 20)
- // Attempt to transfer get-only fullName
- alice[.fullName].set(&susan) // Fatal error (not settable)
Add Comment
Please, Sign In to add comment