2014-11-22 19 views
5

Tôi có một mô tả chuỗi chứa câu của tôi. Tôi chỉ muốn viết hoa chữ cái đầu tiên. Tôi đã thử những thứ khác nhau nhưng hầu hết trong số họ cho tôi ngoại lệ và lỗi. Im sử dụng Xcode 6.Viết hoa chữ cái đầu tiên của câu (Swift)

Đây là những gì tôi đã cố gắng cho đến nay

let cap = [description.substringToIndex(advance(0,1))] as String 
    description = cap.uppercaseString + description.substringFromIndex(1) 

Nó mang lại cho tôi: Loại 'String.Index' không phù hợp với giao thức 'IntegerLiteralConvertible'

tôi đã cố gắng

func capitalizedStringWithLocale(locale:0) -> String 

Nhưng tôi không thể tìm ra cách làm cho nó hoạt động. Bất kỳ ý tưởng nào?

Trả lời

2
import Foundation 

// A lowercase string 
let description = "the quick brown fox jumps over the lazy dog." 

// The start index is the first letter 
let first = description.startIndex 

// The rest of the string goes from the position after the first letter 
// to the end. 
let rest = advance(first,1)..<description.endIndex 

// Glue these two ranges together, with the first uppercased, and you'll 
// get the result you want. Note that I'm using description[first...first] 
// to get the first letter because I want a String, not a Character, which 
// is what you'd get with description[first]. 
let capitalised = description[first...first].uppercaseString + description[rest] 

// Result: "The quick brown fox jumps over the lazy dog." 

Bạn có thể muốn đảm bảo có ít nhất một ký tự trong câu trước khi bắt đầu, nếu không bạn sẽ gặp phải lỗi thời gian chạy để đẩy chỉ mục vượt quá cuối chuỗi.

8

Trong Swift 2, bạn có thể làm String(text.characters.first!).capitalizedString + String(text.characters.dropFirst())

+0

Hơn nữa, nếu bạn muốn có một chữ cái đầu tiên thực sự chỉ vốn hóa chuỗi như "John" hoặc "Doe" chứ không phải "John" và "DOE", bạn có thể làm như sau: 'String (text.characters đầu tiên được viết hoa. + stringizedString + String (text.characters.dropFirst()). lowercased() ' – KingChintz

3

Một khả năng khác trong Swift 3 -

extension String { 
    func capitalizeFirst() -> String { 
     let firstIndex = self.index(startIndex, offsetBy: 1) 
     return self.substring(to: firstIndex).capitalized + self.substring(from: firstIndex).lowercased() 
    } 
} 

Chỉnh sửa cho Swift 4
Cảnh báo từ trên cao Swift 3 số-

'substring (to :)' không được dùng nữa: Vui lòng sử dụng String slicing subscript với 'pa rtial range upto 'toán tử.
'chuỗi con (từ :)' không còn được dùng nữa: Vui lòng sử dụng chuỗi cắt chỉ mục có toán tử 'một phần từ'.

Swift 4 giải pháp -

extension String { 
    var capitalizedFirst: String { 
     guard !isEmpty else { 
      return self 
     } 

     let capitalizedFirstLetter = charAt(i: 0).uppercased() 
     let secondIndex    = index(after: startIndex) 
     let remainingString   = self[secondIndex..<endIndex] 

     let capitalizedString  = "\(capitalizedFirstLetter)\(remainingString)" 
     return capitalizedString 
    } 
} 
1

Dưới đây là làm thế nào để làm điều đó trong Swift 4; chỉ trong trường hợp nếu nó giúp bất cứ ai:

extension String { 
    func captalizeFirstCharacter() -> String { 
     var result = self 

     let substr1 = String(self[startIndex]).uppercased() 
     result.replaceSubrange(...startIndex, with: substr1) 

     return result 
    } 
} 

Nó sẽ không biến đổi gốc String.

1
extension String { 
var capitalizedFirstLetter:String { 
    let string = self 
    return string.replacingCharacters(in: startIndex...startIndex, with: String(self[startIndex]).capitalized) 
} 

}

let newSentence = sentence.capitalizedFirstLetter 
0

Đối với một hoặc mỗi từ trong chuỗi, bạn có thể sử dụng tài sản .capitalized Chuỗi của.

print("foo".capitalized) //prints: Foo 

print("foo foo foo".capitalized) //prints: Foo Foo Foo 
Các vấn đề liên quan