Cập nhật cho Swift 4
Trong Swift 4, String
tuân theo Collection
một lần nữa, vì vậy có thể sử dụng dropFirst
và dropLast
cắt bớt phần đầu và phần cuối của chuỗi. Kết quả là kiểu Substring
, vì vậy bạn cần chuyển nó cho hàm String
tạo để nhận lại String
:
let str = "hello"
let result1 = String(str.dropFirst()) // "ello"
let result2 = String(str.dropLast()) // "hell"
dropFirst()
và dropLast()
cũng có một Int
để chỉ định số lượng ký tự để giảm:
let result3 = String(str.dropLast(3)) // "he"
let result4 = String(str.dropFirst(4)) // "o"
Nếu bạn chỉ định nhiều ký tự cần thả hơn số ký tự trong chuỗi, kết quả sẽ là chuỗi trống ( ""
).
let result5 = String(str.dropFirst(10)) // ""
Cập nhật cho Swift 3
Nếu bạn chỉ muốn xóa ký tự đầu tiên và muốn thay đổi chuỗi gốc tại chỗ, thì hãy xem câu trả lời của @ MickMacCallum. Nếu bạn muốn tạo một chuỗi mới trong quá trình này, hãy sử dụng substring(from:)
. Với tiện ích mở rộng tới String
, bạn có thể che giấu sự xấu xí substring(from:)
và substring(to:)
tạo các phần bổ sung hữu ích để cắt bớt phần đầu và phần cuối của String
:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return substring(from: index(startIndex, offsetBy: count))
}
func chopSuffix(_ count: Int = 1) -> String {
return substring(to: index(endIndex, offsetBy: -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Giống như dropFirst
và dropLast
trước chúng, các hàm này sẽ bị lỗi nếu không có đủ chữ cái có sẵn trong Chuỗi. Cơ hội là ở người gọi để sử dụng chúng đúng cách. Đây là một quyết định thiết kế hợp lệ. Người ta có thể viết chúng để trả về một tùy chọn mà sau đó người gọi sẽ phải mở gói.
Swift 2.x
Than ôi trong Swift 2 , dropFirst
và dropLast
(giải pháp tốt nhất trước đây) không thuận tiện như trước đây. Với tiện ích mở rộng tới String
, bạn có thể che giấu sự xấu xí của substringFromIndex
và substringToIndex
:
extension String {
func chopPrefix(count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
Giống như dropFirst
và dropLast
trước chúng, các hàm này sẽ bị lỗi nếu không có đủ chữ cái có sẵn trong Chuỗi. Cơ hội là ở người gọi để sử dụng chúng đúng cách. Đây là một quyết định thiết kế hợp lệ. Người ta có thể viết chúng để trả về một tùy chọn mà sau đó người gọi sẽ phải mở gói.
Trong Swift 1.2 , bạn sẽ cần gọi chopPrefix
như sau:
"hello".chopPrefix(count: 3) // "lo"
hoặc bạn có thể thêm dấu gạch dưới _
vào định nghĩa hàm để loại bỏ tên tham số:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(_ count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
advance
điều này bằng cách truyềndisplay.text!
tới NSString. Tôi không nói đó là một giải pháp tốt - chỉ là sửa chữa một quan niệm sai lầm có thể xảy ra. Với NSString, bạn có thể lập chỉ mục vào nó bằng Int. - Và lý do bạn không thể lập chỉ mục với Int không phải vì Unicode; đó là bởi vì một Nhân vật có thể bao gồm nhiều điểm mã ghép.