从名称中获取首字母并将其限制为2个首字母

时间:2016-02-09 07:13:45

标签: ios swift

我有以下名称: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,然后删除中间的字母?

6 个答案:

答案 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() ?? "")")
            }
    }
}