Swift menerapkan .uppercaseString hanya untuk huruf pertama dari suatu string

232

Saya mencoba membuat sistem koreksi otomatis, dan ketika pengguna mengetik kata dengan huruf besar, koreksi otomatis tidak berfungsi. Untuk memperbaikinya, saya membuat salinan dari string yang diketik, diterapkan .lowercaseString, dan kemudian membandingkannya. Jika string tersebut salah ketik, seharusnya kata tersebut diperbaiki. Namun kemudian kata yang menggantikan kata yang diketik semuanya huruf kecil. Jadi saya perlu menerapkan .uppercaseString hanya huruf pertama. Awalnya saya pikir saya bisa menggunakan

nameOfString[0]

tetapi ini tampaknya tidak berhasil. Bagaimana saya bisa mendapatkan huruf pertama dari string menjadi huruf besar, dan kemudian dapat mencetak string penuh dengan huruf pertama dikapitalisasi?

Terima kasih atas bantuannya!

Beberapa pria
sumber

Jawaban:

512

Termasuk versi mutasi dan non mutasi yang konsisten dengan pedoman API.

Swift 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()
    }
}

Swift 4:

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

    mutating func capitalizeFirstLetter() {
      self = self.capitalizingFirstLetter()
    }
}
Kirstein
sumber
3
Hanya sebuah catatan yang .capitalizedStringtidak lagi berfungsi di Xcode 7 Beta 4. String telah sedikit berubah di Swift 2.0.
kakubei
2
@ Kirins: Anda benar, salah saya. Saya lupa mengimpor Foundation senyum malu-malu
kakubei
3
@LoryLory Gunakan .uppercaseStringuntuk itu
Kirsteins
2
Ini adalah pasangan jawaban yang sangat efektif..Bekerja dengan Xcode 7.1.1 / Swift 2.1 .... Terima kasih :)
onCompletion
20
baru saja .capitalized. Perhatikan jugacapitalizedStringWith(_ locale:)
Raphael
152

Swift 5.1 atau lebih baru

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

Cepat 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ž"
Leo Dabus
sumber
3
Pekerjaan yang baik. Saya mengedit milik saya untuk lulus huruf kecil dulu dan berganti nama menjadi Proper.
ericgu
Saya suka solusi cepat 2.1.1, tetapi ketika saya menjalankan aplikasi dan memeriksa kebocoran, ini menunjukkan bahwa ini bocor.
Henny Lee
1
Saya baru saja membuat proyek baru dan sepertinya ini menyebabkan kebocoran memori ketika ini digunakan bersama dengan UITextFieldpengamat UITextFieldTextDidChangeNotification.
Henny Lee
@ Henry, ini tidak ada hubungannya dengan kode itu sendiri. jika Anda mengalami masalah kinerja / memori, Anda harus melaporkannya ke Apple.
Leo Dabus
1
@ LeoDabus Saya kira itu ke Yang mana membuat maksud kode lebih jelas. String literal kosong mungkin adalah yang terbaik.
Nicolas Miari
84

Swift 3.0

untuk "Hello World"

nameOfString.capitalized

atau untuk "HELLO WORLD"

nameOfString.uppercased
Maselko
sumber
3
Charlesism sudah menjawab dengan versi Swift 3 dua bulan lalu ...
Eric Aya
11
Ini akan menggunakan huruf besar karakter pertama dari setiap kata dari String dan bukan hanya kata pertama.
Bocaxica
Pengembalian: Salinan string besar. public func uppercased () -> String Swift 3.0 atau untuk "HELLO WORLD" nameOfString.uppercased BUKANNYA DI ATAS nameOfString.uppercased ()
Azharhussain Shaikh
40

Cepat 4.0

string.capitalized(with: nil)

atau

string.capitalized

Namun ini huruf kapital huruf pertama dari setiap kata

Dokumentasi Apple:

String huruf kapital adalah string dengan karakter pertama di setiap kata yang diubah ke nilai huruf besar yang sesuai, dan semua karakter yang tersisa diatur ke nilai huruf kecil yang sesuai. "Kata" adalah setiap urutan karakter yang dibatasi oleh spasi, tab, atau terminator garis. Beberapa tanda baca pembatas kata umum tidak dipertimbangkan, jadi properti ini mungkin tidak secara umum menghasilkan hasil yang diinginkan untuk string multi-kata. Lihat getLineStart (_: end: contentEnd: for :) metode untuk informasi tambahan.

sam k
sumber
1
Saya tidak tahu mengapa orang tidak menerima jawaban ini. Jika orang ingin hanya kata pertama yang ditulis dengan huruf besar, mereka dapat mengambil yang pertama dan memanfaatkannya dengan mudah dengan properti dengan huruf besar.
ScottyBlades
1
Yang penting, "Kapitalisasi" benar untuk semua karakter Unicode, sementara menggunakan "huruf besar" untuk karakter pertama tidak.
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()

Untuk Swift 5:

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())
    }
}
pengguna2260304
sumber
Ini adalah jawaban terbaik IMO - sederhanakan untuk semua kasus mendatang.
Robert
Tidak perlu memeriksa apakah string isEmptydan menginisialisasi string untuk mengganti. Anda dapat dengan mudah membuka karakter pertama dan jika gagal hanya mengembalikan nol. Ini dapat disederhanakan sebagaivar firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
Leo Dabus
17

Untuk karakter pertama dalam kata, gunakan .capitalizeddengan cepat dan untuk penggunaan seluruh kata.uppercased()

DURGESH
sumber
10

Swift 2.0 (baris tunggal):

String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst())
Phil
sumber
1
Terpilih. Namun, ini mengasumsikan bahwa string asli semuanya huruf kecil. Saya menambahkan .localizedLowercaseStringdi akhir untuk membuatnya bekerja dengan string seperti: aNYsTring. String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyalhi
4

Swift 3 (xcode 8.3.3)

Huruf besar semua karakter string pertama

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

//Your String

Huruf besar semua karakter

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

//YOUR STRING

Huruf besar hanya karakter pertama dari string

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

//Your string
castellon oscar
sumber
Ini tidak akan menggunakan huruf besar hanya karakter pertama dari string
Rool Paap
3

Saya mendapatkan karakter pertama diduplikasi dengan solusi Kirsteins. Ini akan menggunakan huruf besar karakter pertama, tanpa melihat ganda:

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

Saya tidak tahu apakah ini lebih atau kurang efisien, saya hanya tahu itu memberi saya hasil yang diinginkan.

Marc Fearby
sumber
Anda dapat menguji apakah menggunakan huruf besar pada karakter pertama akan mengubah karakter tersebut - dengan menyimpannya dalam konstanta sendiri lalu menguji kesetaraan dengan string 'kapital' yang baru, dan jika mereka sama maka Anda sudah memiliki apa yang Anda inginkan.
David H
Posting Anda menginspirasi jawaban ini - terima kasih !: func capitaizeFirstChar (var: String) -> String {if s.isEmpty == false {let range = s.startIndex ... s.startIndex biarkan orisinal = s.substringWithRange (range) biarkan capitalized = original.capitalizedString jika asli == capitalized {return s} s.replaceRange (rentang, dengan: capitalized)} return s}
David H
1
Dalam versi yang lebih baru dari Swift, countElementsadil count.
George Poulos
3

Dari Swift 3 Anda dapat dengan mudah menggunakan textField.autocapitalizationType = UITextAutocapitalizationType.sentences

Yura
sumber
3

Berikut adalah versi untuk Swift 5 yang menggunakan properti skalar properti Unicode untuk menebus jika huruf pertama sudah huruf besar, atau tidak memiliki gagasan kasus:

extension String {
  func firstLetterUppercased() -> String {
    guard let first = first, first.isLowercase else { return self }
    return String(first).uppercased() + dropFirst()
  }
}
Adam Sharp
sumber
Tidak perlu menginisialisasi String dengan karakter pertama. return first.uppercased() + dropFirst()atau satu liner(first?.uppercased() ?? "") + dropFirst()
Leo Dabus
2

Memanfaatkan karakter pertama dalam string

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

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

Di Swift 3.0 (ini sedikit lebih cepat dan lebih aman daripada jawaban yang diterima):

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

nameOfString.capitalized tidak akan berfungsi , itu akan memanfaatkan setiap kata dalam kalimat

pierre23
sumber
1

Penghargaan untuk Leonardo Savio Dabus:

Saya membayangkan sebagian besar kasus penggunaan adalah untuk mendapatkan Casing yang Tepat:

import Foundation

extension String {

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

Solusi saya:

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
}
Nazariy Vlizlo
sumber
"Ini bukan swift murni.
Abhishek Bedi
1

Menggabungkan jawaban di atas, saya menulis ekstensi kecil yang menggunakan huruf kapital dari setiap kata (karena itulah yang saya cari dan saya pikir orang lain bisa menggunakannya).

Dengan rendah hati saya serahkan:

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
    }
}
Mat
sumber
1
Swift String memiliki metode yang disebut capitalizedString. Jika Anda perlu menerapkannya pada serangkaian string, periksa jawaban ini stackoverflow.com/a/28690655/2303865
Leo Dabus
1

Cepat 4

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

Inilah cara saya melakukannya dalam langkah-langkah kecil, mirip dengan @ Kirstein.

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)
}
guptron
sumber
0
func helperCapitalizeFirstLetter(stringToBeCapd:String)->String{
    let capString = stringToBeCapd.substringFromIndex(stringToBeCapd.startIndex).capitalizedString
    return capString
}

Juga berfungsi, cukup masukkan string Anda dan dapatkan kembali dengan huruf besar.

Dan Leonard
sumber
0

Pembaruan Swift 3

The replaceRangefunc sekarangreplaceSubrange

nameOfString.replaceSubrange(nameOfString.startIndex...nameOfString.startIndex, with: String(nameOfString[nameOfString.startIndex]).capitalized)
Brendt Bly
sumber
metode capitalizedString telah diubah namanya menjadi capitalized
Rool Paap
0

Saya setuju dengan versi ini, yang merupakan versi bersih dari jawaban lain:

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

Itu berusaha untuk menjadi lebih efisien dengan hanya mengevaluasi karakter diri sekali, dan kemudian menggunakan bentuk yang konsisten untuk membuat sub-string.

Patrick Beard
sumber
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: " ")
    }
}
Daniel R
sumber
String sudah memiliki properti yang disebut capitalizedtepat untuk tujuan ini
Leo Dabus
0

Jika Anda ingin menggunakan huruf kapital setiap kata string, Anda dapat menggunakan ekstensi ini

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: " ")
    }
}

Bekas

print("simple text example".wordUppercased) //output:: "Simple Text Example"
Shilpriya
sumber
2
cukup gunakan.capitalized
kakubei
0

Jika string Anda semua huruf besar maka metode di bawah ini akan berfungsi

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

Ekstensi ini akan membantu Anda

extension StringProtocol {
    var firstUppercased: String {
        guard let first = first else { return "" }
        return String(first).uppercased() + dropFirst()
    }
}
Ashu
sumber
1
cukup gunakan.capitalized
kakubei
@kakubei Mengapa Anda memberikan suara negatif. Metode ini untuk kasus Sentance. Bermodal akan melakukan setiap karakter pertama kata menjadi modal. Contoh String: - (INI ADALAH ANAK LAKI-LAKI) .capitalizedakan kembali (This Is A Boy) dan metode ini akan kembali (Ini adalah anak laki-laki) Keduanya berbeda. (Tolong jangan + Pilih atau Hapus negatif)
Ashu
Anda benar @ashu, permintaan maaf saya. Namun saya tidak dapat melakukan upvote hingga Anda mengedit jawabannya jadi mungkin hanya perlu mengedit spasi putih dan saya akan memperbaikinya. Maaf lagi.
kakubei
Tidak perlu menginisialisasi String dengan karakter pertama. return first.uppercased() + dropFirst()atau satu liner kembali(first?.uppercased() ?? "") + dropFirst()
Leo Dabus
0

Tambahkan baris ini dalam metode viewDidLoad ().

 txtFieldName.autocapitalizationType = UITextAutocapitalizationType.words
Pranit
sumber
-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)
    }
}
john07
sumber
-1

Untuk swift 5, Anda dapat melakukannya seperti itu:

yourString.firstUppercased

Contoh: "abc" -> "Abc"

Hula
sumber
Tidak ada properti yang diunggah lebih dulu di Swift
Leo Dabus