Swift, bir dizenin yalnızca ilk harfine .uppercaseString uygular


232

Otomatik düzeltme sistemi yapmaya çalışıyorum ve bir kullanıcı büyük harfli bir sözcük yazdığında, otomatik düzeltme çalışmıyor. Bunu düzeltmek için, yazılan dizenin bir kopyasını yaptım .lowercaseString uyguladım ve sonra karşılaştırdım. Dize gerçekten yanlış yazılmışsa, kelimeyi düzeltmelidir. Ancak daha sonra, yazılan sözcüğün yerini alan kelimenin tümü küçük harf olur. Bu yüzden .uppercaseString öğesini yalnızca ilk harfe uygulamam gerekiyor. Aslında kullanabileceğimi düşündüm

nameOfString[0]

ama görünüşe göre bu çalışmıyor. Dizenin ilk harfini büyük harfe nasıl getirebilirim ve ardından ilk harfi büyük harfle yazarak dizenin tamamını yazdırabilir miyim?

Herhangi bir yardım için teşekkürler!

Yanıtlar:


512

API yönergelerine uygun mutasyon ve mutasyona uğramamış sürümler dahil.

Hızlı 3:

extension String {
    func capitalizingFirstLetter() -> String {
        let first = String(characters.prefix(1)).capitalized
        let other = String(characters.dropFirst())
        return first + other
    }

    mutating func capitalizeFirstLetter() {
        self = self.capitalizingFirstLetter()
    }
}

Hızlı 4:

extension String {
    func capitalizingFirstLetter() -> String {
      return prefix(1).uppercased() + self.lowercased().dropFirst()
    }

    mutating func capitalizeFirstLetter() {
      self = self.capitalizingFirstLetter()
    }
}

3
Sadece .capitalizedStringXcode 7 Beta 4'te çalışmayan bir not . Swift 2.0'da dizeler biraz değişti.
kakubei

2
@Kirsteins: haklısın, benim hatam. Ben Foundation koyun sırıtış
kakubei

3
@LoryLory Kullanım .uppercaseStringbunun için
Kirsteins

2
Bu ciddi etkili cevap arkadaşı .. Xcode 7.1.1 / Swift 2.1 ile çalışmak .... Teşekkürler :)
onCompletion

20
sadece .capitalizedşimdi. Ayrıca notcapitalizedStringWith(_ locale:)
Raphael

152

Swift 5.1 veya üstü

extension StringProtocol {
    var firstUppercased: String { prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { prefix(1).capitalized + dropFirst() }
}

Hızlı 5

extension StringProtocol {
    var firstUppercased: String { return prefix(1).uppercased() + dropFirst() }
    var firstCapitalized: String { return prefix(1).capitalized + dropFirst() }
}

"Swift".first  // "S"
"Swift".last   // "t"
"hello world!!!".firstUppercased  // "Hello world!!!"

"DŽ".firstCapitalized   // "Dž"
"Dž".firstCapitalized   // "Dž"
"dž".firstCapitalized   // "Dž"

3
İyi iş. Önce küçük harfe geçmek için benimkini düzenledim ve ismini Proper olarak değiştirdim.
ericgu

Hızlı 2.1.1 çözümünü beğendim, ancak uygulamamı çalıştırıp sızıntıları kontrol ettiğimde, bunun sızdırıldığını gösteriyor.
Henny Lee

1
Sadece yeni bir proje yarattım ve bir UITextFieldgözlemci ile birlikte kullanıldığında bir bellek sızıntısına neden olduğu görülüyor UITextFieldTextDidChangeNotification.
Henny Lee

@Henry kodun kendisi ile ilgisi yoktur. herhangi bir performans / bellek sorunu yaşıyorsanız Apple'a bildirmelisiniz.
Leo Dabus

1
@LeoDabus Sanırım kodun niyetini daha belirgin hale getiriyor. Boş dize hazır bilgisi belki de en iyisidir.
Nicolas Miari

84

Swift 3.0

"Merhaba Dünya" için

nameOfString.capitalized

veya "HELLO WORLD" için

nameOfString.uppercased

3
Charlesism, Swift 3 versiyonuyla iki ay önce cevap verdi ...
Eric Aya

11
Bu, sadece ilk kelimeyi değil, String'in her kelimesinin ilk karakterini büyük harflerle yazacaktır.
Bocaxica

Döndürür: Dizenin büyük harfli bir kopyası. public func uppercased () -> String Swift 3.0 veya "HELLO WORLD" adı içinOfString.uppercased YUKARIDA YERLEŞİMİ nameOfString.uppercased ()
Azharhussain Shaikh

40

Swift 4.0

string.capitalized(with: nil)

veya

string.capitalized

Ancak bu her kelimenin ilk harfini büyük yapar

Apple'ın belgeleri:

Büyük harfli dize, her sözcüğün ilk karakteri karşılık gelen büyük harf değerine ve kalan tüm karakterler karşılık gelen küçük harf değerlerine ayarlanmış bir dizedir. "Sözcük", boşluklar, sekmeler veya satır sonlandırıcılarla sınırlandırılmış herhangi bir karakter dizisidir. Bazı ortak kelime sınırlama noktalama işaretleri dikkate alınmadığından, bu özellik genellikle çok kelimeli dizeler için istenen sonuçları vermeyebilir. Ek bilgi için getLineStart (_: end: contentEnd: for :) yöntemine bakın.


1
İnsanların neden bu cevaba açık olmadıkları hakkında hiçbir fikrim yok. Eğer insanlar sadece ilk büyük harfli kelimeyi istiyorlarsa, ilk kelimeyi kapabilir ve büyük harflerle en kolay şekilde büyük harfle yazabilirler.
ScottyBlades

1
Önemlisi, "Büyük harf" tüm Unicode karakterler için doğru, ilk karakter için "büyük harf" kullanarak değil.
gnasher729

23
extension String {
    func firstCharacterUpperCase() -> String? {
        let lowercaseString = self.lowercaseString

        return lowercaseString.stringByReplacingCharactersInRange(lowercaseString.startIndex...lowercaseString.startIndex, withString: String(lowercaseString[lowercaseString.startIndex]).uppercaseString)
    }
}

let x = "heLLo"
let m = x.firstCharacterUpperCase()

Swift 5 için:

extension String {
    func firstCharacterUpperCase() -> String? {
        guard !isEmpty else { return nil }
        let lowerCasedString = self.lowercased()
        return lowerCasedString.replacingCharacters(in: lowerCasedString.startIndex...lowerCasedString.startIndex, with: String(lowerCasedString[lowerCasedString.startIndex]).uppercased())
    }
}

Bu en iyi cevap IMO - gelecekteki tüm durumlar için basit tutar.
Robert

Dize olup olmadığını kontrol etmek isEmptyve ikisini de değiştirmek için bir dize başlatmak gerek yok. Sadece ilk karakterin paketini açabilir ve başarısız olması durumunda sıfır döndürebilirsiniz. Bu basitleştirilebilirvar firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
Leo Dabus

17

.capitalizedHızlı sözcük kullanımı ve tam sözcük kullanımı için ilk karakter.uppercased()


10

Swift 2.0 (Tek satır):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())

1
Upvoted. Ancak, bu özgün dizenin tümünün küçük harf olduğunu varsayar. Eklediğim .localizedLowercaseStringaNYsTring: Bu gibi dizeleri ile çalışmasını sağlamak için sonunda. String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyalhi

4

Swift 3 (xcode 8.3.3)

Dizenin tüm ilk karakterlerini büyük harfe çevirme

let str = "your string"
let capStr = str.capitalized

//Your String

Tüm karakterleri büyük harfe çevirme

let str = "your string"
let upStr = str.uppercased()

//YOUR STRING

Dizenin yalnızca ilk karakteri büyük harf

 var str = "your string"
 let capStr = String(str.characters.prefix(1)).uppercased() + String(str.characters.dropFirst())

//Your string

Bu, bir dizenin sadece ilk karakterini büyük harfe dönüştürmez
Rool Paap


3

Kirsteins'in çözümü ile ilk karakteri tekrar ediyorum. Bu, çift görmeden ilk karakteri büyük harfe çevirir:

var s: String = "hello world"
s = prefix(s, 1).capitalizedString + suffix(s, countElements(s) - 1)

Az ya da çok verimli olup olmadığını bilmiyorum, sadece istenen sonucu verdiğini biliyorum.


İlk karakterin büyük harfle yazılmasının bu karakteri değiştirip değiştirmediğini test edebilirsiniz - onu kendi sabitinde kaydedip yeni 'büyük harfli' dizeyle eşitliği test ederek ve eğer bunlar aynıysa zaten istediğiniz şeye sahipsiniz.
David H

Yayınınız bu cevaba ilham verdi - teşekkürler !: func capitaizeFirstChar (var s: String) -> String {if s.isEmpty == false {let range = s.startIndex ... s.startIndex orijinal olsun = s.substringWithRange (aralık) let capitalized = original.capitalizedString, original == capitalized {return s} s.replaceRange (aralık, büyük harfle yazılmış)} return s}
David H

1
Swift'in yeni sürümlerinde countElements, sadece count.
George Poulos

3

Swift 3'ten kolayca kullanabilirsiniz textField.autocapitalizationType = UITextAutocapitalizationType.sentences


3

Swift 5 için , ilk harf zaten büyük harfse veya büyük / küçük harf durumunda değilse kefalet için Unicode skaler özellikleri API'sini kullanan bir sürüm :

extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}

Bir dizeyi ilk karakterle başlatmanıza gerek yoktur. return first.uppercased() + dropFirst()veya bir astar(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

2

Dizedeki ilk karakteri büyük harfe çevirme

extension String {
    var capitalizeFirst: String {
        if self.characters.count == 0 {
            return self

        return String(self[self.startIndex]).capitalized + String(self.characters.dropFirst())
    }
}

2

Swift 3.0'da (bu, kabul edilen cevaptan biraz daha hızlı ve daha güvenlidir):

extension String {
    func firstCharacterUpperCase() -> String {
        if let firstCharacter = characters.first {
            return replacingCharacters(in: startIndex..<index(after: startIndex), with: String(firstCharacter).uppercased())
        }
        return ""
    }
}

nameOfString.capitalized çalışmaz , cümledeki her kelimeyi büyük harfe çevirir


1

Leonardo Savio Dabus'a verilen krediler:

Çoğu kullanım vakasının uygun kasa elde etmek olduğunu düşünüyorum:

import Foundation

extension String {

    var toProper:String {
        var result = lowercaseString
        result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).capitalizedString)
        return result
    }
}

1

Çözümüm:

func firstCharacterUppercaseString(string: String) -> String {
    var str = string as NSString
    let firstUppercaseCharacter = str.substringToIndex(1).uppercaseString
    let firstUppercaseCharacterString = str.stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: firstUppercaseCharacter)
    return firstUppercaseCharacterString
}

Bu saf hızlı değil.
Abhishek Bedi

1

Yukarıdaki cevapları dahil ederek, her kelimenin ilk harfini büyük harfle yazan küçük bir uzantı yazdım (çünkü aradığım ve başka birinin kullanabileceğini düşündüm).

Alçakgönüllü gönderiyorum:

extension String {
    var wordCaps:String {
        let listOfWords:[String] = self.componentsSeparatedByString(" ")
        var returnString: String = ""
        for word in listOfWords {
            if word != "" {
                var capWord = word.lowercaseString as String
                capWord.replaceRange(startIndex...startIndex, with: String(capWord[capWord.startIndex]).uppercaseString)
                returnString = returnString + capWord + " "
            }
        }
        if returnString.hasSuffix(" ") {
            returnString.removeAtIndex(returnString.endIndex.predecessor())
        }
        return returnString
    }
}

1
Swift String, capitalizedString adlı bir yönteme sahiptir. Bir dizi dizeye uygulamanız gerekiyorsa, bu yanıtı kontrol edin stackoverflow.com/a/28690655/2303865
Leo Dabus

1

Hızlı 4

func firstCharacterUpperCase() -> String {
        if self.count == 0 { return self }
        return prefix(1).uppercased() + dropFirst().lowercased()
    }

0

İşte bunu küçük adımlarla yaptım, @Kirsteins'e benziyor.

func capitalizedPhrase(phrase:String) -> String {
    let firstCharIndex = advance(phrase.startIndex, 1)
    let firstChar = phrase.substringToIndex(firstCharIndex).uppercaseString
    let firstCharRange = phrase.startIndex..<firstCharIndex
    return phrase.stringByReplacingCharactersInRange(firstCharRange, withString: firstChar)
}

0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

Ayrıca çalışır sadece dize geçmek ve büyük bir geri almak.


0

Swift 3 Güncellemesi

replaceRangeFonk şimdireplaceSubrange

nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)

capitalizedString yöntemi, büyük harfle değiştirildi
Rool Paap

0

Ben başka bir cevap temizlenmiş bir sürümü olan bu sürümü, kısmi:

extension String {
  var capitalizedFirst: String {
    let characters = self.characters
    if let first = characters.first {
      return String(first).uppercased() + 
             String(characters.dropFirst())
    }
    return self
  }
}

Benlik karakterlerini yalnızca bir kez değerlendirerek daha verimli olmaya çalışır ve sonra alt dizeleri oluşturmak için tutarlı formlar kullanır.


0

Swift 4 (Xcode 9.1)

extension String {
    var capEachWord: String {
        return self.split(separator: " ").map { word in
            return String([word.startIndex]).uppercased() + word.lowercased().dropFirst()
        }.joined(separator: " ")
    }
}

Dize zaten capitalizedbu amaç için tam olarak adlandırılan bir özelliğe sahip
Leo Dabus

0

Her bir string kelimesini büyük harfle yazmak istiyorsanız bu uzantıyı kullanabilirsiniz

Swift 4 Xcode 9.2

extension String {
    var wordUppercased: String {
        var aryOfWord = self.split(separator: " ")
        aryOfWord =  aryOfWord.map({String($0.first!).uppercased() + $0.dropFirst()})
        return aryOfWord.joined(separator: " ")
    }
}

Kullanılmış

print("simple text example".wordUppercased) //output:: "Simple Text Example"

2
sadece kullanın.capitalized
kakubei

0

Dizeniz tamamen büyük harfse, aşağıdaki yöntem işe yarayacaktır

labelTitle.text = remarks?.lowercased().firstUppercased

Bu uzantı size yardımcı olacaktır

extension StringProtocol {
    var firstUppercased: String {
        guard let first = first else { return "" }
        return String(first).uppercased() + dropFirst()
    }
}

1
sadece kullanın.capitalized
kakubei

@kakubei Neden olumsuz oy kullanıyorsunuz. Bu yöntem Sentance vakası içindir. Büyük harf kullanımı sözcüğün her ilk karakterini sermayeye yapar. Örnek Dize: - (BU BİR ERKEK) .capitalizeddöner (Bu Bir Erkek) ve bu yöntem geri döner (Bu bir erkek) Her ikisi de farklı. (Lütfen + ve Oy Ver veya Negatif Kaldır)
Ashu

Haklısın @ashu, özür dilerim. Ancak cevabı düzenleyene kadar oy kullanamıyorum, bu yüzden belki sadece küçük bir beyaz alan düzenlemesi yapın ve ben oyu kaldırırım. Tekrar özür dilerim.
kakubei

Bir dizeyi ilk karakterle başlatmanıza gerek yoktur. return first.uppercased() + dropFirst()veya bir astar dönüşü(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

0

Bu satırı viewDidLoad () yöntemine ekleyin.

 txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words

-1
extension String {
    var lowercased:String {
        var result = Array<Character>(self.characters);
        if let first = result.first { result[0] = Character(String(first).uppercaseString) }
        return String(result)
    }
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.