Tất cả các ví dụ sau đều sử dụng
var str = "Hello, playground"
startIndex
và endIndex
startIndex
là chỉ số của ký tự đầu tiên
endIndex
là chỉ số sau ký tự cuối cùng.
Thí dụ
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Với phạm vi một phía của Swift 4 , phạm vi có thể được đơn giản hóa thành một trong các dạng sau.
let range = str.startIndex...
let range = ..<str.endIndex
Tôi sẽ sử dụng biểu mẫu đầy đủ trong các ví dụ sau để rõ ràng hơn, nhưng để dễ đọc, bạn có thể sẽ muốn sử dụng phạm vi một phía trong mã của mình.
after
Như trong: index(after: String.Index)
after
đề cập đến chỉ số của ký tự ngay sau chỉ số đã cho.
Ví dụ
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
Như trong: index(before: String.Index)
before
đề cập đến chỉ số của ký tự ngay trước chỉ số đã cho.
Ví dụ
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
Như trong: index(String.Index, offsetBy: String.IndexDistance)
- Các
offsetBy
giá trị có thể là tích cực hay tiêu cực và bắt đầu từ chỉ số nhất định. Mặc dù nó thuộc loại String.IndexDistance
, bạn có thể cho nó một Int
.
Ví dụ
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
Như trong: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Điều
limitedBy
này rất hữu ích để đảm bảo rằng phần bù không làm cho chỉ mục đi ra ngoài giới hạn. Nó là một chỉ mục giới hạn. Vì có thể bù đắp vượt quá giới hạn, phương thức này trả về tùy chọn. Nó trả về nil
nếu chỉ mục nằm ngoài giới hạn.
Thí dụ
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Nếu phần bù đã được 77
thay vì 7
, thì if
câu lệnh sẽ bị bỏ qua.
Tại sao cần String.Index?
Sẽ dễ dàng hơn nhiều nếu sử dụng một Int
chỉ mục cho Chuỗi. Lý do mà bạn phải tạo mới String.Index
cho mỗi Chuỗi là các ký tự trong Swift không có cùng độ dài dưới mui xe. Một ký tự Swift đơn lẻ có thể bao gồm một, hai hoặc thậm chí nhiều điểm mã Unicode. Vì vậy, mỗi Chuỗi duy nhất phải tính chỉ số của các Ký tự của nó.
Có thể ẩn sự phức tạp này đằng sau một phần mở rộng chỉ mục Int, nhưng tôi không muốn làm như vậy. Thật tốt khi được nhắc nhở về những gì đang thực sự xảy ra.
startIndex
là bất kỳ điều gì khác hơn 0?