Created
June 23, 2018 15:41
-
-
Save H-Ghadirian/cb920d92c04a668404d50eb05154daad 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
struct User { | |
let name: String? | |
let surname: String? | |
let nickname: String? | |
} | |
//Our goal is to build a human-readable string in a: | |
//Name Surname, "Nickname" | |
//format. | |
//The example output would be: | |
//Jakub Turek, "Brogrammer" | |
//--------------------------------------------------- | |
//Non functional approach | |
//It is very probable to put some bug | |
extension User { | |
var readableName: String { | |
if let name = name, let surname = surname, let nickname = nickname, !name.isEmpty, !surname.isEmpty, !nickname.isEmpty { | |
return "\(name) \(surname), \"\(nickname)\"" | |
} else if let name = name, let surname = surname, !name.isEmpty, !surname.isEmpty { | |
return "\(name) \(surname)" | |
} else if let name = name, let nickname = nickname, !name.isEmpty, !nickname.isEmpty { | |
return "\(name), \"\(nickname)\"" | |
} else if let name = name, !name.isEmpty { | |
return name | |
} else if let surname = surname, let nickname = nickname, !surname.isEmpty, !nickname.isEmpty { | |
return "\(surname), \"\(nickname)\"" | |
} else if let surname = surname, !surname.isEmpty { | |
return surname | |
} else if let nickname = nickname, !nickname.isEmpty { | |
return "\"\(nickname)\"" | |
} else { | |
return "" | |
} | |
} | |
} | |
//--------------------------------------------------- | |
//Functional Approach | |
extension Sequence where Iterator.Element == Optional<String> { | |
func joinedNonBlanks(separator: String) -> String { | |
return self | |
.flatMap { $0 } | |
.filter { !$0.isEmpty } | |
.joined(separator: separator) | |
} | |
} | |
extension User { | |
var fullName: String { | |
return [name, surname].joinedNonBlanks(separator: " ") | |
} | |
} | |
extension User { | |
var formattedNickname: String? { | |
return nickname.flatMap { !$0.isEmpty ? "\"\($0)\"" : nil } | |
} | |
} | |
extension User { | |
var presentedFullName: String { | |
return [fullName, formattedNickname].joinedNonBlanks(separator: ", ") | |
} | |
} | |
//--------------------------------------------------- | |
//Usage: | |
User(name: nil, surname: "", nickname: "Brogrammer").presentedFullName == "\"Brogrammer\"" | |
User(name: "Jakub", surname: "", nickname: "Brogrammer").presentedFullName == "Jakub, \"Brogrammer\"" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment