Swift áp dụng .uppercaseString chỉ chữ cái đầu tiên của chuỗi


232

Tôi đang cố gắng tạo một hệ thống tự động sửa lỗi và khi người dùng nhập một từ bằng chữ in hoa, thì tự động sửa không hoạt động. Để khắc phục điều này, tôi đã tạo một bản sao của chuỗi đã nhập, áp dụng .lowercaseString và sau đó so sánh chúng. Nếu chuỗi thực sự bị sai, nó sẽ sửa từ. Tuy nhiên, sau đó từ thay thế từ đánh máy là tất cả chữ thường. Vì vậy, tôi cần phải áp dụng .uppercaseString cho chữ cái đầu tiên. Ban đầu tôi nghĩ mình có thể sử dụng

nameOfString[0]

nhưng điều này dường như không hoạt động. Làm cách nào tôi có thể nhận được chữ cái đầu tiên của chuỗi thành chữ hoa và sau đó có thể in toàn bộ chuỗi với chữ cái đầu tiên được viết hoa?

Cảm ơn vì bất kì sự giúp đỡ!

Câu trả lời:


512

Bao gồm các phiên bản đột biến và không đột biến phù hợp với nguyên tắc 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()
    }
}

3
Chỉ cần lưu ý rằng .capitalizedStringkhông còn hoạt động trong Xcode 7 Beta 4. Chuỗi đã thay đổi một chút trong Swift 2.0.
kakubei

2
@Kirsteins: bạn nói đúng, xấu của tôi. Tôi đã quên nhập khẩu Foundation nụ cười ngượng ngùng
kakubei

3
@LoryLory Sử dụng .uppercaseStringcho điều đó
Kirsteins

2
Đây là câu trả lời hiệu quả nghiêm trọng của bạn bè..Làm việc với Xcode 7.1.1 / Swift 2.1 .... Cảm ơn :)
onCompletion

20
nó chỉ là .capitalizedbây giờ Cũng lưu ýcapitalizedStringWith(_ locale:)
Raphael

152

Swift 5.1 trở lên

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

Swift 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
Công việc tốt. Tôi đã chỉnh sửa của tôi để vượt qua chữ thường trước và đổi tên thành Thích hợp.
ericgu

Tôi thích giải pháp swift 2.1.1, nhưng khi tôi chạy ứng dụng của mình và kiểm tra rò rỉ, nó cho thấy điều này bị rò rỉ.
Henny Lee

1
Tôi vừa tạo một dự án mới và có vẻ như nó gây ra rò rỉ bộ nhớ khi nó được sử dụng cùng với một UITextFieldngười quan sát UITextFieldTextDidChangeNotification.
Henny Lee

@Henry điều này không có gì để làm với chính mã. nếu bạn gặp bất kỳ vấn đề về hiệu năng / bộ nhớ, bạn nên báo cáo với Apple.
Leo Dabus

1
@LeoDabus Tôi đoán nó thuộc về cái nào làm cho ý định của mã trở nên rõ ràng hơn. Chuỗi rỗng có lẽ là tốt nhất.
Nicolas Miari

84

Swift 3.0

cho "Xin chào thế giới"

nameOfString.capitalized

hoặc cho "HELLO WORLD"

nameOfString.uppercased

3
Charlesism đã trả lời với phiên bản Swift 3 hai tháng trước ...
Eric Aya

11
Điều này sẽ viết hoa ký tự đầu tiên của mỗi từ của Chuỗi và không chỉ từ đầu tiên.
Bocaxica

Trả về: Một bản sao chữ hoa của chuỗi. Func công uppercased () -> String Swift 3.0 hoặc cho "HELLO WORLD" nameOfString.uppercased THAY TRÊN nameOfString.uppercased ()
Azharhussain Shaikh

40

Swift 4.0

string.capitalized(with: nil)

hoặc là

string.capitalized

Tuy nhiên, chữ này viết hoa chữ cái đầu tiên của mỗi từ

Tài liệu của Apple:

Chuỗi viết hoa là một chuỗi có ký tự đầu tiên trong mỗi từ được thay đổi thành giá trị chữ hoa tương ứng và tất cả các ký tự còn lại được đặt thành giá trị chữ thường tương ứng của chúng. Một từ tiếng Nhật là một chuỗi các ký tự được phân cách bằng dấu cách, tab hoặc dấu kết thúc dòng. Một số dấu chấm phân cách từ phổ biến không được xem xét, do đó, thuộc tính này thường không tạo ra kết quả mong muốn cho chuỗi đa từ. Xem phương thức getLineStart (_: end: nội dungEnd: for :) để biết thêm thông tin.


1
Tôi không biết tại sao mọi người không chấp nhận câu trả lời này. Nếu mọi người chỉ muốn từ đầu tiên được viết hoa, họ có thể lấy từ đầu tiên và viết hoa dễ dàng nhất với tài sản được viết hoa.
ScottyBlades

1
Điều quan trọng, "Viết hoa" là chính xác cho tất cả các ký tự Unicode, trong khi sử dụng "cấp trên" cho ký tự đầu tiên thì không.
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()

Dành cho 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())
    }
}

Đây là câu trả lời tốt nhất IMO - giữ cho nó đơn giản cho tất cả các trường hợp trong tương lai.
Robert

Không cần kiểm tra nếu chuỗi isEmptyvà khởi tạo một chuỗi để thay thế. Bạn chỉ có thể mở khóa ký tự đầu tiên và trong trường hợp thất bại, chỉ cần trả về nil. Điều này có thể được đơn giản hóa nhưvar firstCharacterUpperCase: String? { guard let first = first else { return nil } return lowercased().replacingCharacters(in: startIndex...startIndex, with: first.uppercased()) }
Leo Dabus

17

Đối với ký tự đầu tiên trong việc sử dụng từ .capitalizedtrong swift và cho toàn bộ từ sử dụng.uppercased()


10

Swift 2.0 (Dòng đơn):

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

1
Nâng cao. Tuy nhiên, điều này giả định rằng chuỗi gốc là tất cả chữ thường. Tôi đã thêm .localizedLowercaseStringvào cuối để làm cho nó hoạt động với các chuỗi như: aNYsTring. String(nameOfString.characters.prefix(1)).uppercaseString + String(nameOfString.characters.dropFirst()).localizedLowercaseString
oyaltyhi

4

Swift 3 (xcode 8.3.3)

Viết hoa tất cả các ký tự đầu tiên của chuỗi

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

//Your String

Viết hoa tất cả các ký tự

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

//YOUR STRING

Ký tự đầu tiên của chuỗi

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

//Your string

Điều này sẽ không viết hoa chỉ ký tự đầu tiên của chuỗi
Rool Paap


3

Tôi nhận được nhân vật đầu tiên được nhân đôi với giải pháp của Kirsteins. Điều này sẽ viết hoa ký tự đầu tiên, mà không nhìn thấy gấp đôi:

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

Tôi không biết nó hiệu quả hơn hay kém hơn, tôi chỉ biết rằng nó mang lại cho tôi kết quả mong muốn.


Bạn có thể kiểm tra xem viết hoa ký tự đầu tiên có thay đổi ký tự đó hay không - bằng cách lưu nó trong hằng số của chính nó sau đó kiểm tra tính bằng với chuỗi 'viết hoa' mới và nếu chúng giống nhau thì bạn đã có những gì bạn muốn.
David H

Bài đăng của bạn đã truyền cảm hứng cho câu trả lời này - cảm ơn !: func capitaizeFirstChar (var s: String) -> String {if s.isEmpty == false {let Range = s.startIndex ... s.startIndex let gốc = s.subopesWithRange (phạm vi) let capitalized = original.capitalizedString if gốc == capitalized {return s} s.replaceRange (phạm vi, với: capitalized)} return s}
David H

1
Trong các phiên bản mới hơn của Swift, countElementschỉ là count.
George Poulos

3

Từ Swift 3 bạn có thể dễ dàng sử dụng textField.autocapitalizationType = UITextAutocapitalizationType.sentences


3

Đây là phiên bản dành cho Swift 5 sử dụng API thuộc tính vô hướng Unicode để bảo lãnh nếu chữ cái đầu tiên là chữ hoa hoặc không có khái niệm về trường hợp:

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

Không cần phải khởi tạo Chuỗi với ký tự đầu tiên. return first.uppercased() + dropFirst()hoặc một lớp lót(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

2

Viết hoa ký tự đầu tiên trong chuỗi

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

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

2

Trong Swift 3.0 (điều này nhanh hơn một chút và an toàn hơn câu trả lời được chấp nhận):

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

nameOfString.capitalized sẽ không hoạt động , nó sẽ viết hoa mọi từ trong câu


1

Tín dụng cho Leonardo Savio Dabus:

Tôi tưởng tượng hầu hết các trường hợp sử dụng là để có Vỏ đúng:

import Foundation

extension String {

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

1

Giải pháp của tôi:

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
}

Không nhanh chóng tinh khiết này.
Abhishek Bedi

1

Kết hợp các câu trả lời ở trên, tôi đã viết một phần mở rộng nhỏ viết hoa chữ cái đầu tiên của mỗi từ (vì đó là những gì tôi đang tìm kiếm và hình dung người khác có thể sử dụng nó).

Tôi khiêm tốn nộp:

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
Chuỗi Swift có một phương thức gọi là capitalizedString. Nếu bạn cần áp dụng nó cho một chuỗi các chuỗi, hãy kiểm tra câu trả lời này stackoverflow.com/a/28690655/2303865
Leo Dabus 17/2/2016

1

Swift 4

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

0

Đây là cách tôi đã làm trong các bước nhỏ, tương tự như @Kirsteins.

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
}

Cũng hoạt động chỉ cần vượt qua chuỗi của bạn và nhận lại một viết hoa.


0

Cập nhật Swift 3

Các replaceRangeFunc tại làreplaceSubrange

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

phương thức capitalizedString đã được đổi tên thành viết hoa
Rool Paap

0

Tôi là một phần của phiên bản này, đây là phiên bản đã được dọn sạch từ một câu trả lời khác:

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

Nó cố gắng để có hiệu quả hơn bằng cách chỉ đánh giá self.char character một lần, sau đó sử dụng các biểu mẫu nhất quán để tạo các chuỗi con.


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

Chuỗi đã có một thuộc tính được gọi capitalizedchính xác cho mục đích này
Leo Dabus

0

Nếu bạn muốn viết hoa từng từ của chuỗi, bạn có thể sử dụng tiện ích mở rộng này

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

Đã sử dụng

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

2
chỉ cần sử dụng.capitalized
kakubei

0

Nếu chuỗi của bạn là tất cả các mũ thì phương thức bên dưới sẽ hoạt động

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

Tiện ích mở rộng này sẽ giúp bạn

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

1
chỉ cần sử dụng.capitalized
kakubei

@kakubei Tại sao bạn bỏ phiếu tiêu cực. Phương pháp này dành cho trường hợp Sentance. Viết hoa sẽ làm mọi ký tự đầu tiên của từ để viết hoa. Chuỗi ví dụ: - (NÀY LÀ MỘT BOY) .capitalizedsẽ trở lại (This Is A Boy) và phương thức này sẽ trả về (Đây là một cậu bé) Cả hai đều khác nhau. (Vui lòng bình chọn hoặc xóa bỏ phủ định)
Ashu

Bạn nói đúng @ashu, lời xin lỗi của tôi. Tuy nhiên tôi không thể upvote cho đến khi bạn chỉnh sửa câu trả lời để có thể chỉ cần chỉnh sửa khoảng trắng nhỏ và tôi sẽ upvote nó. Xin lỗi lần nữa.
kakubei

Không cần phải khởi tạo Chuỗi với ký tự đầu tiên. return first.uppercased() + dropFirst()hoặc một lần trở lại lót(first?.uppercased() ?? "") + dropFirst()
Leo Dabus

0

Đối với swift 5, bạn có thể đơn giản làm như vậy:

yourString.firstUppercased

Mẫu: "abc" -> "Abc"


Không có tài sản đầu tiên trong Swift
Leo Dabus

0

Thêm dòng này trong phương thức viewDidLoad ().

 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)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.