Skip to content

Instantly share code, notes, and snippets.

@H-Ghadirian
Created June 23, 2018 15:41
Show Gist options
  • Save H-Ghadirian/cb920d92c04a668404d50eb05154daad to your computer and use it in GitHub Desktop.
Save H-Ghadirian/cb920d92c04a668404d50eb05154daad to your computer and use it in GitHub Desktop.
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