2016-02-09 25 views
6

我有以下名字:John Fitzgerald Kennedy獲取從一個名字的首字母縮寫,它限制在2名縮寫

要得到它的縮寫,我創建了一個方法:

extension String { 
    public var first: String { 
     return String(self[startIndex]) 
    } 
} 

let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ") 
     .reduce("") { $0 + $1.first } 

輸出爲:JFK

有沒有用我的方法一種優雅的方式(以減少)到那些最初僅侷限於JK,消除中間的字母?

+0

注意,這將打破許多非英語的名字。在西班牙名字中,名字的最後部分不一定是最重要的。並且不要讓我從亞洲名字開始。如果您需要正確的首字母,則需要用戶填寫他們。 – Sulthan

+0

是的,我想給用戶的方式來改變它。謝謝。 – Nico

回答

12

雨燕2.0

如何:

let initials = "John Fitzgerald Kennedy".componentsSeparatedByString(" ") 
.reduce("") { ($0 == "" ? "" : $0.first) + $1.first} 

這也將在那裏該名稱沒有中間名或多於1中間名的情況下照顧。

斯威夫特3

let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.characters.first!)") + "\($1.characters.first!)" } 

斯威夫特4

let initials = "John Fitzgerald Kennedy".components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.first!)") + "\($1.first!)" } 
+0

不錯!謝謝。 – Nico

+0

嗨我得到的錯誤:'下標'不可用:不能下標字符串與CountableClosedRange ,請參閱文檔評論討論....在Swift 3 +什麼版本的SWIFT是這樣的? –

+0

也就是說雨燕2.0 ...我會更新 –

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 } 

注:這個人是不是在乎沒有中間名或多於一個

+0

什麼,如果全名超過1中間名,或者沒有中間的名字嗎?這是行不通的。 –

+0

是的,你說的對,你的解決方案好多了 – avdyushin

相關問題