从名字中获取首字母并将其限制为 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() ?? "")")
            }
    }
}