从名字中获取首字母并将其限制为 2 个首字母
Get the initials from a name and limit it to 2 initials
我有一个名字:John Fitzgerald Kennedy
。
为了得到它的首字母,我创建了一个方法:
extension String {
public var first: String {
return String(self[startIndex])
}
}
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { [=10=] + .first }
输出为:JFK
我的方法(使用 reduce)是否有一种优雅的方法将这些首字母限制为仅 JK
,然后删除中间的字母?
Swift 2.0
这个怎么样:
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { ([=10=] == "" ? "" : [=10=].first) + .first}
这也会处理姓名没有中间名或超过 1 个中间名的情况。
Swift 3
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ([=11=] == "" ? "" : "\([=11=].characters.first!)") + "\(.characters.first!)" }
Swift 4
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ([=12=] == "" ? "" : "\([=12=].first!)") + "\(.first!)" }
按奇数索引枚举和过滤
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.enumerate()
.filter { (index, _) -> Bool in return index % 2 == 0 }
.reduce("") { a, i in return a + i.element.first }
注:这个不在乎没有中间名或者多了一个
Swift 4,一点额外的工作,但是使用 PersonNameComponentsFormatter。
// 注意: 我们考虑姓名后缀(示例:III、II、Jr、Sr)或前缀(Mr、Mrs)
let fullName = “Mr John Jacob Smith III”
let formatter = PersonNameComponentsFormatter()
guard let personNameComponents = formatter.personNameComponents(from: fullName) else {
return ""
}
return personNameComponents.initials
// 注意: 同时为 PersonNameComponents 创建扩展
// 人名组件+Initials.swift
import Foundation
extension PersonNameComponents {
var fullName: String {
return [givenName, middleName, familyName].compactMap{ [=11=] }.joined(separator: " ")
}
var fullNameWithSuffix: String {
return [givenName, middleName, familyName, nameSuffix].compactMap{ [=11=] }.joined(separator: " ")
}
var initials: String {
let firstName = givenName?.first ?? Character(" ")
let lastName = familyName?.first ?? Character(" ")
return "\(firstName)\(lastName)".trimmingCharacters(in: .whitespaces)
}
// Note: If You need first, middle, last
/*
var initials: String {
let firstName = givenName?.first ?? Character(" ")
let middleName = middleName?.first ?? Character(" ")
let lastName = familyName?.first ?? Character(" ")
return "\(firstName)\(middleName)\(lastName)".trimmingCharacters(in: .whitespaces)
}
*/
}
如果您的目标是 iOS 9 及以上:
let formatter = PersonNameComponentsFormatter()
if let components = formatter.personNameComponents(from: name) {
formatter.style = .abbreviated
return formatter.string(from: components)
}
extension String {
var initials: String {
return self.components(separatedBy: " ").filter { ![=10=].isEmpty }.reduce("") { ([=10=] == "" ? "" : "\([=10=].first!)") + "\(.first!)" }
}
}
这修复了 Guy Daher 的解决方案中的崩溃问题。
这是我的解决方案。
Swift 5
extension String {
var initials: String {
return self.components(separatedBy: " ")
.reduce("") {
([=10=].isEmpty ? "" : "\([=10=].first?.uppercased() ?? "")") +
(.isEmpty ? "" : "\(.first?.uppercased() ?? "")")
}
}
}
我有一个名字:John Fitzgerald Kennedy
。
为了得到它的首字母,我创建了一个方法:
extension String {
public var first: String {
return String(self[startIndex])
}
}
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { [=10=] + .first }
输出为:JFK
我的方法(使用 reduce)是否有一种优雅的方法将这些首字母限制为仅 JK
,然后删除中间的字母?
Swift 2.0
这个怎么样:
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { ([=10=] == "" ? "" : [=10=].first) + .first}
这也会处理姓名没有中间名或超过 1 个中间名的情况。
Swift 3
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ([=11=] == "" ? "" : "\([=11=].characters.first!)") + "\(.characters.first!)" }
Swift 4
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ([=12=] == "" ? "" : "\([=12=].first!)") + "\(.first!)" }
按奇数索引枚举和过滤
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.enumerate()
.filter { (index, _) -> Bool in return index % 2 == 0 }
.reduce("") { a, i in return a + i.element.first }
注:这个不在乎没有中间名或者多了一个
Swift 4,一点额外的工作,但是使用 PersonNameComponentsFormatter。
// 注意: 我们考虑姓名后缀(示例:III、II、Jr、Sr)或前缀(Mr、Mrs)
let fullName = “Mr John Jacob Smith III”
let formatter = PersonNameComponentsFormatter()
guard let personNameComponents = formatter.personNameComponents(from: fullName) else {
return ""
}
return personNameComponents.initials
// 注意: 同时为 PersonNameComponents 创建扩展
// 人名组件+Initials.swift
import Foundation
extension PersonNameComponents {
var fullName: String {
return [givenName, middleName, familyName].compactMap{ [=11=] }.joined(separator: " ")
}
var fullNameWithSuffix: String {
return [givenName, middleName, familyName, nameSuffix].compactMap{ [=11=] }.joined(separator: " ")
}
var initials: String {
let firstName = givenName?.first ?? Character(" ")
let lastName = familyName?.first ?? Character(" ")
return "\(firstName)\(lastName)".trimmingCharacters(in: .whitespaces)
}
// Note: If You need first, middle, last
/*
var initials: String {
let firstName = givenName?.first ?? Character(" ")
let middleName = middleName?.first ?? Character(" ")
let lastName = familyName?.first ?? Character(" ")
return "\(firstName)\(middleName)\(lastName)".trimmingCharacters(in: .whitespaces)
}
*/
}
如果您的目标是 iOS 9 及以上:
let formatter = PersonNameComponentsFormatter()
if let components = formatter.personNameComponents(from: name) {
formatter.style = .abbreviated
return formatter.string(from: components)
}
extension String {
var initials: String {
return self.components(separatedBy: " ").filter { ![=10=].isEmpty }.reduce("") { ([=10=] == "" ? "" : "\([=10=].first!)") + "\(.first!)" }
}
}
这修复了 Guy Daher 的解决方案中的崩溃问题。
这是我的解决方案。
Swift 5
extension String {
var initials: String {
return self.components(separatedBy: " ")
.reduce("") {
([=10=].isEmpty ? "" : "\([=10=].first?.uppercased() ?? "")") +
(.isEmpty ? "" : "\(.first?.uppercased() ?? "")")
}
}
}