Last active
March 30, 2019 15:25
-
-
Save hitendradeveloper/fae3d6d04a9b71e3125ea6270f321cc9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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