我有以下名称:John Fitzgerald Kennedy
。
为了得到它的首字母,我创建了一个方法:
extension String {
public var first: String {
return String(self[startIndex])
}
}
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { $0 + $1.first }
输出为:JFK
我的方法(使用reduce)是否有一种优雅的方式将这些首字母限制为JK
,然后删除中间的字母?
答案 0 :(得分:18)
Swift 2.0
这个怎么样:
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.reduce("") { ($0 == "" ? "" : $0.first) + $1.first}
这也将处理名称没有中间名或多于1个中间名的情况。
Swift 3
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.characters.first!)") + "\($1.characters.first!)" }
Swift 4
let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.first!)") + "\($1.first!)" }
答案 1 :(得分:6)
快速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创建扩展名
// PersonNameComponents + Initials.swift
import Foundation
extension PersonNameComponents {
var fullName: String {
return [givenName, middleName, familyName].compactMap{ $0 }.joined(separator: " ")
}
var fullNameWithSuffix: String {
return [givenName, middleName, familyName, nameSuffix].compactMap{ $0 }.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)
}
*/
}
答案 2 :(得分:0)
枚举并按奇数索引过滤
let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ")
.enumerate()
.filter { (index, _) -> Bool in return index % 2 == 0 }
.reduce("") { a, i in return a + i.element.first }
注意:这个不关心没有中间名或多个
答案 3 :(得分:0)
如果您定位到iOS 9及更高版本:
showMainBanner
答案 4 :(得分:0)
extension String {
var initials: String {
return self.components(separatedBy: " ").filter { !$0.isEmpty }.reduce("") { ($0 == "" ? "" : "\($0.first!)") + "\($1.first!)" }
}
}
这解决了 Guy Daher 的解决方案崩溃的问题。
答案 5 :(得分:0)
这是我的解决方法。
快捷键5
extension String {
var initials: String {
return self.components(separatedBy: " ")
.reduce("") {
($0.isEmpty ? "" : "\($0.first?.uppercased() ?? "")") +
($1.isEmpty ? "" : "\($1.first?.uppercased() ?? "")")
}
}
}