Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hitendradeveloper/fae3d6d04a9b71e3125ea6270f321cc9 to your computer and use it in GitHub Desktop.
Save hitendradeveloper/fae3d6d04a9b71e3125ea6270f321cc9 to your computer and use it in GitHub Desktop.
//This is function in playground which executes our test code
func main() {
var hitendra = Person() //person with empty details
let personBuilder = PersonBuilder(person: hitendra)
hitendra = personBuilder
.personalInfo
.nameIs("Hitendra Solanki")
.genderIs("Male")
.bornOn("2nd Oct 1991")
.bornAt("Gujarat, India")
.havingHeight("5.9 ft")
.havingWeight("85 kg")
.contacts
.hasPhone("+91 90333-71772")
.hasEmail("hitendra.developer@gmail.com")
.lives
.at("52nd Godrej Street")
.inCity("Ahmedabad")
.withZipCode("380015")
.build()
//use of Person object
print("\(hitendra.name) has contact number \(hitendra.phone) and email \(hitendra.email)")
//later on when we have company details ready for the person
hitendra = personBuilder
.works
.asA("Software architect")
.inCompany("Fortune 500")
.hasAnnualEarning("45,000 USD")
.build()
//use of Person object with update info
print("\(hitendra.name) works in \(hitendra.companyName) compay as a \(hitendra.designation).")
}
//call main to execute our test code
main()
//Person class which only contains the details
class Person {
//personal details
var name: String = ""
var gender: String = ""
var birthDate: String = ""
var birthPlace: String = ""
var height: String = ""
var weight: String = ""
//contact details
var phone: String = ""
var email: String = ""
//address details
var streeAddress: String = ""
var zipCode: String = ""
var city: String = ""
//work details
var companyName: String = ""
var designation: String = ""
var annualIncome: String = ""
//empty constructor
init() { }
}
//PersonBuilder class helps to construct the person class instance
class PersonBuilder {
var person: Person
init(person: Person){
self.person = person
}
//personal details builder switching
var personalInfo: PersonPersonalDetailsBuilder {
return PersonPersonalDetailsBuilder(person: self.person)
}
//contact details builder switching
var contacts: PersonContactDetailsBuilder {
return PersonContactDetailsBuilder(person: self.person)
}
//address details builder switching
var lives: PersonAddressDetailsBuilder {
return PersonAddressDetailsBuilder(person: self.person)
}
//work details builder switching
var works: PersonCompanyDetailsBuilder {
return PersonCompanyDetailsBuilder(person: self.person)
}
func build() -> Person {
return self.person
}
}
//PersonPersonalDetailsBuilder: update personal details
class PersonPersonalDetailsBuilder: PersonBuilder {
func nameIs(_ name: String) -> Self {
self.person.name = name
return self
}
func genderIs(_ gender: String) -> Self {
self.person.gender = gender
return self
}
func bornOn(_ birthDate: String) -> Self {
self.person.birthDate = birthDate
return self
}
func bornAt(_ birthPlace: String) -> Self {
self.person.birthPlace = birthPlace
return self
}
func havingHeight(_ height: String) -> Self {
self.person.height = height
return self
}
func havingWeight(_ weight: String) -> Self {
self.person.weight = weight
return self
}
}
//PersonContactDetailsBuilder: update contact details
class PersonContactDetailsBuilder: PersonBuilder {
func hasPhone(_ phone: String) -> Self {
self.person.phone = phone
return self
}
func hasEmail(_ email: String) -> Self {
self.person.email = email
return self
}
}
//PersonAddressDetailsBuilder: update address details
class PersonAddressDetailsBuilder: PersonBuilder {
func at(_ streeAddress: String) -> Self {
self.person.streeAddress = streeAddress
return self
}
func withZipCode(_ zipCode: String) -> Self {
self.person.zipCode = zipCode
return self
}
func inCity(_ city: String) -> Self {
self.person.city = city
return self
}
}
//PersonCompanyDetailsBuilder: update company details
class PersonCompanyDetailsBuilder: PersonBuilder {
func inCompany(_ companyName: String) -> Self {
self.person.companyName = companyName
return self
}
func asA(_ designation: String) -> Self {
self.person.designation = designation
return self
}
func hasAnnualEarning(_ annualIncome: String) -> Self {
self.person.annualIncome = annualIncome
return self
}
}
/* Console output:
Hitendra Solanki has contact number +91 90333-71772 and email hitendra.developer@gmail.com
Hitendra Solanki works in Fortune 500 compay as a Software architect.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment