Tất cả các ví dụ sau sử dụng
var str = "Hello, playground"
Swift 4
Chuỗi có một đại tu khá lớn trong Swift 4. Khi bạn nhận được một số chuỗi con từ Chuỗi bây giờ, bạn sẽ nhận được một Substring
kiểu trở lại thay vì a String
. Tại sao lại thế này? Chuỗi là loại giá trị trong Swift. Điều đó có nghĩa là nếu bạn sử dụng một Chuỗi để tạo một Chuỗi mới, thì nó phải được sao chép lại. Điều này tốt cho sự ổn định (không ai khác sẽ thay đổi nó mà bạn không biết) nhưng lại không tốt cho hiệu quả.
Mặt khác, một Chuỗi con là một tham chiếu trở lại Chuỗi ban đầu mà nó xuất hiện. Dưới đây là một hình ảnh từ tài liệu minh họa rằng.
Không cần sao chép nên sử dụng hiệu quả hơn nhiều. Tuy nhiên, hãy tưởng tượng bạn có một Chuỗi con mười ký tự từ Chuỗi triệu ký tự. Vì Chuỗi con đang tham chiếu Chuỗi, nên hệ thống sẽ phải giữ toàn bộ Chuỗi miễn là Chuỗi con ở xung quanh. Do đó, bất cứ khi nào bạn hoàn thành thao tác Chuỗi con của mình, hãy chuyển đổi nó thành Chuỗi.
let myString = String(mySubstring)
Điều này sẽ chỉ sao chép chuỗi con qua và bộ nhớ giữ Chuỗi cũ có thể được lấy lại . Chất nền (như một loại) có nghĩa là sống ngắn.
Một cải tiến lớn khác trong Swift 4 là Chuỗi là Bộ sưu tập (một lần nữa). Điều đó có nghĩa là bất cứ điều gì bạn có thể làm với Bộ sưu tập, bạn có thể làm với Chuỗi (sử dụng các mục con, lặp lại qua các ký tự, bộ lọc, v.v.).
Các ví dụ sau đây cho thấy cách lấy chuỗi con trong Swift.
Bắt chất nền
Bạn có thể lấy một chuỗi con từ một chuỗi bằng cách sử dụng kí hiệu hoặc một số phương pháp khác (ví dụ, prefix
, suffix
, split
). Bạn vẫn cần sử dụng String.Index
và không phải là một Int
chỉ mục cho phạm vi. (Xem câu trả lời khác của tôi nếu bạn cần giúp đỡ về điều đó.)
Bắt đầu một chuỗi
Bạn có thể sử dụng một mục con (lưu ý phạm vi một phía của Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
hoặc prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
hoặc thậm chí dễ dàng hơn:
let mySubstring = str.prefix(5) // Hello
Kết thúc chuỗi
Sử dụng đăng ký:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
hoặc suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
hoặc thậm chí dễ dàng hơn:
let mySubstring = str.suffix(10) // playground
Lưu ý rằng khi sử dụng suffix(from: index)
tôi phải đếm lại từ cuối bằng cách sử dụng -10
. Điều đó là không cần thiết khi chỉ sử dụng suffix(x)
, chỉ cần lấy các x
ký tự cuối cùng của Chuỗi.
Phạm vi trong một chuỗi
Một lần nữa chúng tôi chỉ đơn giản là sử dụng đăng ký ở đây.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Chuyển đổi Substring
sangString
Đừng quên, khi bạn đã sẵn sàng lưu chuỗi con của mình, bạn nên chuyển đổi nó thành một String
bộ nhớ để chuỗi cũ có thể được dọn sạch.
let myString = String(mySubstring)
Sử dụng một Int
phần mở rộng chỉ mục?
Tôi ngần ngại sử dụng Int
tiện ích mở rộng chỉ mục dựa trên sau khi đọc bài viết Chuỗi trong Swift 3 của Airspeed Velocity và Ole Begemann. Mặc dù trong Swift 4, String là các bộ sưu tập, nhóm Swift cố tình không sử dụng Int
các chỉ mục. Nó vẫn còn String.Index
. Điều này có liên quan đến các Nhân vật Swift được tạo thành từ các số lượng khác nhau của các loại tiền mã hóa Unicode. Chỉ số thực tế phải được tính toán duy nhất cho mỗi chuỗi.
Tôi phải nói rằng, tôi hy vọng nhóm Swift tìm ra cách để trừu tượng hóa String.Index
trong tương lai. Nhưng cho đến khi họ chọn sử dụng API của họ. Nó giúp tôi nhớ rằng các thao tác Chuỗi không chỉ là Int
tra cứu chỉ mục đơn giản .