Thoát html là gì

Một chuỗi là một chuỗi các ký tự, chẳng hạn như "hello, world" hoặc "albatross". Chuỗi Swift được đại diện bởi loại String. Nội dung của String có thể được truy cập theo nhiều cách khác nhau, bao gồm cả dưới dạng tập hợp các giá trị Character

Các loại StringCharacter của Swift cung cấp một cách nhanh chóng, tuân thủ Unicode để làm việc với văn bản trong mã của bạn. Cú pháp tạo và thao tác chuỗi nhẹ và dễ đọc, với cú pháp ký tự chuỗi tương tự như C. Nối chuỗi đơn giản như kết hợp hai chuỗi với toán tử + và khả năng thay đổi chuỗi được quản lý bằng cách chọn giữa một hằng hoặc một biến, giống như bất kỳ giá trị nào khác trong Swift. Bạn cũng có thể sử dụng chuỗi để chèn hằng, biến, ký tự và biểu thức vào chuỗi dài hơn, trong một quy trình được gọi là phép nội suy chuỗi. Điều này giúp dễ dàng tạo các giá trị chuỗi tùy chỉnh để hiển thị, lưu trữ và in

Mặc dù có cú pháp đơn giản như vậy, kiểu String của Swift là một cách triển khai chuỗi hiện đại, nhanh chóng. Mỗi chuỗi bao gồm các ký tự Unicode mã hóa độc lập và cung cấp hỗ trợ để truy cập các ký tự đó trong các biểu diễn Unicode khác nhau

Ghi chú

Loại String của Swift được kết nối với lớp "albatross"0 của Foundation. Foundation cũng mở rộng String để hiển thị các phương thức được xác định bởi "albatross"0. Điều này có nghĩa là, nếu bạn nhập Foundation, bạn có thể truy cập các phương thức "albatross"0 đó trên String mà không cần truyền

Để biết thêm thông tin về cách sử dụng String với Foundation và Cocoa, hãy xem Cầu nối giữa Chuỗi và NSString

Chuỗi ký tự¶

Bạn có thể bao gồm các giá trị String được xác định trước trong mã của mình dưới dạng chuỗi ký tự. Chuỗi ký tự là một chuỗi các ký tự được bao quanh bởi dấu ngoặc kép ("albatross"7)

Sử dụng một chuỗi ký tự làm giá trị ban đầu cho một hằng số hoặc biến

  1. let someString = "Một số giá trị chuỗi ký tự"

Lưu ý rằng Swift suy ra một loại String cho hằng số "albatross"9 vì nó được khởi tạo với một giá trị chuỗi ký tự

Chuỗi chữ nhiều dòng¶

Nếu bạn cần một chuỗi kéo dài nhiều dòng, hãy sử dụng chuỗi ký tự nhiều dòng—một chuỗi ký tự được bao quanh bởi ba dấu ngoặc kép

  1. hãy trích dẫn = """
  2. Thỏ trắng đeo kính. "Tôi sẽ bắt đầu từ đâu,
  3. làm ơn thưa bệ hạ?" anh hỏi
  4. “Hãy bắt đầu từ đầu,” Nhà vua nghiêm trang nói, “và tiếp tục
  5. cho đến khi bạn đi đến cùng; . "
  6. """

Một chuỗi ký tự nhiều dòng bao gồm tất cả các dòng nằm giữa dấu ngoặc kép mở và đóng của nó. Chuỗi bắt đầu ở dòng đầu tiên sau dấu ngoặc kép mở (String0) và kết thúc ở dòng trước dấu ngoặc kép đóng, nghĩa là không có chuỗi nào bên dưới bắt đầu hoặc kết thúc bằng dấu ngắt dòng

  1. let singleLineString = "Chúng giống nhau. "
  2. let multilineString = """
  3. những cái này giống nhau
  4. """

Khi mã nguồn của bạn bao gồm một dấu ngắt dòng bên trong một chuỗi ký tự nhiều dòng, thì dấu ngắt dòng đó cũng xuất hiện trong giá trị của chuỗi. Nếu bạn muốn sử dụng ngắt dòng để làm cho mã nguồn của mình dễ đọc hơn, nhưng bạn không muốn ngắt dòng là một phần giá trị của chuỗi, hãy viết dấu gạch chéo ngược (String1) ở cuối các dòng đó

  1. let softWrappedQuotation = """
  2. Thỏ trắng đeo kính. "Tôi sẽ bắt đầu từ đâu, \
  3. làm ơn thưa bệ hạ?" anh hỏi
  4. “Hãy bắt đầu từ đầu,” Nhà vua nghiêm trang nói, “và tiếp tục.
  5. cho đến khi bạn đi đến cùng; . "
  6. """

Để tạo một chuỗi ký tự nhiều dòng bắt đầu hoặc kết thúc bằng nguồn cấp dữ liệu, hãy viết một dòng trống làm dòng đầu tiên hoặc dòng cuối cùng. Ví dụ

  1. let ngắt dòng = """
  2. Chuỗi này bắt đầu bằng một ngắt dòng
  3. Nó cũng kết thúc bằng một ngắt dòng
  4. """

Một chuỗi nhiều dòng có thể được thụt vào để khớp với mã xung quanh. Khoảng trắng trước dấu ngoặc kép đóng (String0) cho Swift biết khoảng trắng cần bỏ qua trước tất cả các dòng khác. Tuy nhiên, nếu bạn viết khoảng trắng ở đầu dòng ngoài những gì ở trước dấu ngoặc kép đóng, thì khoảng trắng đó được bao gồm

Thoát html là gì

Trong ví dụ trên, mặc dù toàn bộ chuỗi ký tự nhiều dòng được thụt vào, dòng đầu tiên và dòng cuối cùng trong chuỗi không bắt đầu bằng bất kỳ khoảng trắng nào. Dòng ở giữa có nhiều thụt đầu dòng hơn so với dấu ngoặc kép đóng, do đó, nó bắt đầu với khoảng cách thụt lề thêm bốn khoảng trắng đó

Các ký tự đặc biệt trong chuỗi ký tự¶

Chuỗi ký tự có thể bao gồm các ký tự đặc biệt sau

  • Các ký tự đặc biệt thoát String3 (ký tự null), String4 (dấu gạch chéo ngược), String5 (tab ngang), String6 (dấu dòng), String7 (dấu xuống hàng), String8 (dấu ngoặc kép) và String9 (dấu ngoặc kép)

  • Một giá trị vô hướng Unicode tùy ý, được viết là String0nString1, trong đó n là số thập lục phân có 1–8 chữ số (Unicode được thảo luận trong Unicode bên dưới

Đoạn mã dưới đây cho thấy bốn ví dụ về các ký tự đặc biệt này. Hằng số String2 chứa hai dấu ngoặc kép thoát. Các hằng số String3, String4 và String5 thể hiện định dạng vô hướng Unicode

  1. hãy Lời nói khôn ngoan = "\"Trí tưởng tượng quan trọng hơn kiến ​​thức\" - Einstein"<
  2. // "Trí tưởng tượng quan trọng hơn kiến ​​thức" - Einstein
  3. let DollarSign = "\u{24}" // $, Unicode scalar U+0024
  4. let blackHeart = "\u{2665}" // ♥, Unicode scalar U+2665
  5. hãy trái tim lấp lánh = "\u{1F496}" // 💖, Unicode scalar U+1F496

Bởi vì ký tự chuỗi nhiều dòng sử dụng ba dấu ngoặc kép thay vì chỉ một dấu ngoặc kép, bạn có thể bao gồm dấu ngoặc kép kép ("albatross"7) bên trong ký tự chuỗi nhiều dòng mà không thoát nó. Để bao gồm văn bản String0 trong một chuỗi nhiều dòng, thoát khỏi ít nhất một trong các dấu ngoặc kép. Ví dụ

  1. hãy baDoubleQuotationMarks = """
  2. Thoát khỏi dấu ngoặc kép đầu tiên \"""
  3. Thoát cả ba dấu ngoặc kép \"\"\"
  4. """

Dấu tách chuỗi mở rộng¶

Bạn có thể đặt một chuỗi ký tự bên trong các dấu phân cách mở rộng để bao gồm các ký tự đặc biệt trong một chuỗi mà không cần gọi hiệu ứng của chúng. Bạn đặt chuỗi của mình trong dấu ngoặc kép ("albatross"7) và bao quanh đó bằng các dấu số (String9). Ví dụ: in chuỗi ký tự Character0 in chuỗi thoát nguồn cấp dữ liệu dòng (String6) thay vì in chuỗi trên hai dòng

Nếu bạn cần các hiệu ứng đặc biệt của một ký tự trong một chuỗi ký tự, hãy khớp số ký hiệu số trong chuỗi theo sau ký tự thoát (String1). Ví dụ: nếu chuỗi của bạn là Character0 và bạn muốn ngắt dòng, bạn có thể sử dụng Character4 để thay thế. Tương tự, Character5 cũng ngắt dòng

Các chuỗi ký tự được tạo bằng cách sử dụng các dấu phân cách mở rộng cũng có thể là các chuỗi ký tự nhiều dòng. Bạn có thể sử dụng các dấu phân cách mở rộng để bao gồm văn bản String0 trong một chuỗi nhiều dòng, thay thế hành vi mặc định kết thúc chuỗi ký tự bằng chữ. Ví dụ

  1. let threeMoreDoubleQuotationMarks = #"""
  2. Dưới đây là ba trích dẫn kép. """
  3. """#

Khởi tạo một chuỗi rỗng¶

Để tạo một giá trị String trống làm điểm bắt đầu để xây dựng một chuỗi dài hơn, hãy gán một chuỗi ký tự trống cho một biến hoặc khởi tạo một thể hiện String mới bằng cú pháp bộ khởi tạo

  1. var emptyString = "" // chuỗi rỗng
  2. var anotherEmptyString = String () // initializer syntax
  3. // hai chuỗi này đều rỗng và tương đương với nhau

Tìm hiểu xem giá trị String có trống hay không bằng cách kiểm tra thuộc tính Boolean String0 của nó

  1. if emptyString . isEmpty {
  2. print ( "Không có gì để xem ở đây" )
  3. }
  4. // In ra "Không có gì để xem ở đây"

Khả năng thay đổi chuỗi¶

Bạn cho biết liệu một String cụ thể có thể được sửa đổi (hoặc bị thay đổi) hay không bằng cách gán nó cho một biến (trong trường hợp đó nó có thể được sửa đổi) hoặc cho một hằng số (trong trường hợp đó nó không thể được sửa đổi)

  1. var variableString = "Horse"
  2. variableString += " và vận chuyển"
  3. // biếnString bây giờ là "Ngựa và cỗ xe"
  4. let constantString = "Highlander"
  5. constantString += " và một Highlander khác"
  6. // điều này báo lỗi thời gian biên dịch - không thể sửa đổi một chuỗi hằng số

Ghi chú

Cách tiếp cận này khác với biến đổi chuỗi trong Objective-C và Cocoa, nơi bạn chọn giữa hai lớp ("albatross"0 và String3) để chỉ ra liệu một chuỗi có thể được thay đổi hay không

Chuỗi là loại giá trị¶

Loại String của Swift là một loại giá trị. Nếu bạn tạo một giá trị String mới, thì giá trị String đó sẽ được sao chép khi nó được truyền cho một hàm hoặc phương thức hoặc khi nó được gán cho một hằng số hoặc biến. Trong mỗi trường hợp, một bản sao mới của giá trị String hiện có được tạo và bản sao mới được chuyển hoặc chỉ định chứ không phải bản gốc. Các loại giá trị được mô tả trong Cấu trúc và kiểu liệt kê là các loại giá trị .

Hành vi sao chép theo mặc định String của Swift đảm bảo rằng khi một hàm hoặc phương thức chuyển cho bạn một giá trị String, rõ ràng là bạn sở hữu chính xác giá trị String đó, bất kể giá trị đó đến từ đâu. Bạn có thể yên tâm rằng chuỗi bạn được thông qua sẽ không bị sửa đổi trừ khi bạn tự sửa đổi nó

Đằng sau hậu trường, trình biên dịch của Swift tối ưu hóa việc sử dụng chuỗi sao cho việc sao chép thực tế chỉ diễn ra khi thực sự cần thiết. Điều này có nghĩa là bạn luôn có được hiệu suất tuyệt vời khi làm việc với các chuỗi dưới dạng các loại giá trị

Làm việc với nhân vật¶

Bạn có thể truy cập các giá trị Character riêng lẻ cho một String bằng cách lặp qua chuỗi bằng vòng lặp Character3-Character4

  1. cho nhân vật trong "Chó. 🐶" {
  2. in ( ký tự )
  3. }
  4. // D
  5. // o
  6. //g
  7. //
  8. // 🐶

Vòng lặp Character3-Character4 được mô tả trong Vòng lặp nhập .

Ngoài ra, bạn có thể tạo một biến hoặc hằng số Character độc lập từ một chuỗi ký tự đơn bằng cách cung cấp chú thích loại Character

  1. let dấu chấm than . Nhân vật = ". "

Giá trị String có thể được xây dựng bằng cách chuyển một mảng gồm giá trị Character làm đối số cho bộ khởi tạo của nó

  1. let Nhân vật mèo . [ Nhân vật ] = [ "C" , "a", "t", "!" , "🐱" ]
  2. let catString = String ( catCharacters)
  3. in ( catString )
  4. // In ra "Con mèo. 🐱"

Nối chuỗi và ký tự¶

Các giá trị String có thể được cộng cùng nhau (hoặc nối) với toán tử cộng (+) để tạo một giá trị String mới

  1. let string1 = "xin chào"
  2. let string2 = " ở đó"
  3. var chào mừng = string1 + string2
  4. // chào mừng bây giờ bằng "xin chào"

Bạn cũng có thể nối thêm giá trị String vào biến String hiện có bằng toán tử gán phép cộng (+6)

  1. var hướng dẫn = "xem qua"
  2. hướng dẫn += chuỗi2
  3. // hướng dẫn bây giờ bằng "nhìn qua đó"

Bạn có thể thêm giá trị Character vào biến String bằng phương thức String0 của loại String

  1. let dấu chấm than . Nhân vật = ". "
  2. chào mừng . chắp thêm ( dấu chấm than )
  3. // chào mừng bây giờ bằng "xin chào. "

Ghi chú

Bạn không thể nối thêm một biến String hoặc Character vào một biến Character hiện có, bởi vì giá trị Character chỉ được chứa một ký tự duy nhất

Nếu bạn đang sử dụng các ký tự chuỗi nhiều dòng để xây dựng các dòng của một chuỗi dài hơn, bạn muốn mọi dòng trong chuỗi kết thúc bằng dấu ngắt dòng, bao gồm cả dòng cuối cùng. Ví dụ

  1. let badStart = """
  2. một
  3. hai
  4. """
  5. hãy kết thúc = """
  6. số ba
  7. """
  8. in ( badStart + end)
  9. // In hai dòng
  10. // một
  11. // hai ba
  12. hãy goodStart = """
  13. một
  14. hai
  15. """
  16. in ( goodStart + end)
  17. // In ba dòng
  18. // một
  19. // hai
  20. // số ba

Trong đoạn mã trên, nối String5 với String6 tạo ra một chuỗi hai dòng, đây không phải là kết quả mong muốn. Vì dòng cuối cùng của String5 không kết thúc bằng dấu ngắt dòng nên dòng đó được kết hợp với dòng đầu tiên của String6. Ngược lại, cả hai dòng của String9 đều kết thúc bằng dấu ngắt dòng, vì vậy khi kết hợp nó với String6, kết quả sẽ có ba dòng, như mong đợi

Nội suy chuỗi¶

Nội suy chuỗi là một cách để xây dựng một giá trị String mới từ hỗn hợp các hằng, biến, ký tự và biểu thức bằng cách bao gồm các giá trị của chúng bên trong một ký tự chuỗi. Bạn có thể sử dụng phép nội suy chuỗi trong cả chuỗi ký tự một dòng và nhiều dòng. Mỗi mục mà bạn chèn vào chuỗi ký tự được đặt trong một cặp dấu ngoặc đơn, bắt đầu bằng dấu gạch chéo ngược (String1)

  1. hãy hệ số = 3
  2. hãy thông báo = " \ (multiplier) times 2.5 is \ (Gấp đôi ( multiplier) * 2.5)"
  3. // thông báo là "3 nhân 2. 5 là 7. 5"

Trong ví dụ trên, giá trị của String3 được chèn vào một chuỗi ký tự là String4. Trình giữ chỗ này được thay thế bằng giá trị thực của String3 khi phép nội suy chuỗi được đánh giá để tạo một chuỗi thực

Giá trị của String3 cũng là một phần của biểu thức lớn hơn ở phần sau của chuỗi. Biểu thức này tính toán giá trị của String7 và chèn kết quả (String8) vào chuỗi. Trong trường hợp này, biểu thức được viết là String9 khi nó được bao gồm bên trong chuỗi ký tự

Bạn có thể sử dụng các dấu phân cách chuỗi mở rộng để tạo các chuỗi chứa các ký tự mà nếu không sẽ được coi là phép nội suy chuỗi. Ví dụ

  1. print ( #"Viết một chuỗi nội suy trong Swift sử dụng \(multiplier). "# )
  2. // In ra "Viết một chuỗi nội suy trong Swift sử dụng \(multiplier). "

Để sử dụng phép nội suy chuỗi bên trong một chuỗi sử dụng dấu phân cách mở rộng, hãy so khớp số ký hiệu số sau dấu gạch chéo ngược với số ký hiệu số ở đầu và cuối chuỗi. Ví dụ

  1. in ( #"6 nhân 7 là \# (6 * 7)."# )
  2. // In ra "6 nhân 7 là 42. "

Ghi chú

Các biểu thức bạn viết bên trong dấu ngoặc đơn trong một chuỗi nội suy không được chứa dấu gạch chéo ngược không thoát (_______21), dấu xuống dòng hoặc xuống dòng. Tuy nhiên, chúng có thể chứa các chuỗi ký tự khác

Unicode¶

Unicode là một tiêu chuẩn quốc tế để mã hóa, biểu diễn và xử lý văn bản trong các hệ thống chữ viết khác nhau. Nó cho phép bạn đại diện cho hầu hết mọi ký tự từ bất kỳ ngôn ngữ nào ở dạng chuẩn hóa, đồng thời đọc và viết các ký tự đó đến và từ một nguồn bên ngoài chẳng hạn như tệp văn bản hoặc trang web. Các loại StringCharacter của Swift hoàn toàn tương thích với Unicode, như được mô tả trong phần này

Giá trị vô hướng Unicode¶

Đằng sau hậu trường, loại String gốc của Swift được xây dựng từ các giá trị vô hướng Unicode. Giá trị vô hướng Unicode là một số 21 bit duy nhất cho một ký tự hoặc từ bổ nghĩa, chẳng hạn như "albatross"04 cho "albatross"05 ("albatross"06) hoặc "albatross"07 cho "albatross"08 ("albatross"09)

Lưu ý rằng không phải tất cả các giá trị vô hướng Unicode 21 bit đều được gán cho một ký tự—một số giá trị vô hướng được dành riêng cho việc gán trong tương lai hoặc để sử dụng trong mã hóa UTF-16. Các giá trị vô hướng đã được gán cho một ký tự thường cũng có tên, chẳng hạn như "albatross"05 và "albatross"08 trong các ví dụ trên

Cụm đồ thị mở rộng¶

Mọi phiên bản của loại Character của Swift đại diện cho một cụm grapheme mở rộng duy nhất. Cụm biểu đồ mở rộng là một chuỗi gồm một hoặc nhiều vô hướng Unicode (khi được kết hợp) tạo ra một ký tự mà con người có thể đọc được

Đây là một ví dụ. Chữ cái "albatross"13 có thể được biểu diễn dưới dạng vô hướng Unicode duy nhất "albatross"13 ("albatross"15, hoặc "albatross"16). Tuy nhiên, cùng một chữ cái cũng có thể được biểu diễn dưới dạng một cặp số vô hướng—một chữ cái tiêu chuẩn "albatross"17 ("albatross"18, hoặc "albatross"19), theo sau là số vô hướng "albatross"20 ("albatross"21). Vô hướng "albatross"20 được áp dụng bằng đồ họa cho vô hướng đứng trước nó, biến "albatross"17 thành "albatross"13 khi nó được hiển thị bởi hệ thống kết xuất văn bản nhận biết Unicode

Trong cả hai trường hợp, chữ cái "albatross"13 được biểu diễn dưới dạng một giá trị Swift Character duy nhất biểu thị một cụm grapheme mở rộng. Trong trường hợp đầu tiên, cụm chứa một vô hướng duy nhất;

  1. hãy eAcute . Nhân vật = "\u{E9}" // é
  2. hãy kết hợpEAcute . Nhân vật = "\u{65}\u{301}" // e followed by ́
  3. // eAcute là é, tổ hợpEAcute là é

Các cụm biểu đồ mở rộng là một cách linh hoạt để biểu diễn nhiều ký tự tập lệnh phức tạp dưới dạng một giá trị Character duy nhất. Ví dụ: các âm tiết Hangul từ bảng chữ cái tiếng Hàn có thể được biểu diễn dưới dạng một chuỗi được sắp xếp sẵn hoặc được phân tách. Cả hai biểu diễn này đều đủ điều kiện là một giá trị Character duy nhất trong Swift

  1. let soạn trước . Nhân vật = "\u{D55C}" // 한
  2. hãy phân hủy . Nhân vật = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ
  3. // viết tắt là 한, viết tắt là 한

Các cụm biểu đồ mở rộng cho phép các đại lượng vô hướng cho các dấu kèm theo (chẳng hạn như "albatross"29 hoặc "albatross"30) để kèm theo các đại lượng vô hướng Unicode khác như một phần của một giá trị Character

  1. hãy kèm theoEAcute . Nhân vật = "\u{E9}\u{20DD}"
  2. // kèm theoEAcute là é⃝

Có thể kết hợp vô hướng Unicode cho các ký hiệu chỉ báo khu vực theo cặp để tạo thành một giá trị Character duy nhất, chẳng hạn như sự kết hợp này của "albatross"33 ("albatross"34) và "albatross"35 ("albatross"36)

  1. hãy regionalIndicatorForUS . Nhân vật = "\u{1F1FA}\u{1F1F8}"
  2. // khu vựcIndicatorForUS là 🇺🇸

Đếm ký tự¶

Để truy xuất tổng số các giá trị Character trong một chuỗi, hãy sử dụng thuộc tính "albatross"38 của chuỗi

  1. let unusual Menagerie = "Koala 🐨, Ốc sên 🐌, Chim cánh cụt 🐧, Lạc đà một bướu 🐪"
  2. in ( "unusualMenagerie has \ (unusualMenagerie.đếm) ký tự" )
  3. // In ra "unusualMenagerie co 40 doan"

Lưu ý rằng việc Swift sử dụng các cụm biểu đồ mở rộng cho các giá trị Character có nghĩa là việc nối và sửa đổi chuỗi có thể không phải lúc nào cũng ảnh hưởng đến số lượng ký tự của chuỗi

Ví dụ: nếu bạn khởi tạo một chuỗi mới bằng từ có bốn ký tự "albatross"40, sau đó nối thêm một "albatross"20 ("albatross"21) vào cuối chuỗi, thì chuỗi kết quả sẽ vẫn có tổng số ký tự là "albatross"43, với ký tự thứ tư là "albatross"44

  1. var word = "cafe"
  2. in ( "số ký tự trong \ . word) is \(word.đếm)" )
  3. // In ra "số ký tự trong cafe là 4"
  4. từ += "\u{301}" // KẾT HỢP DẤU CHÍNH XÁC, U+
  5. in ( "số ký tự trong \ . word) is \(word.đếm)" )
  6. // In ra "số ký tự trong quán cà phê là 4"

Ghi chú

Các cụm grapheme mở rộng có thể bao gồm nhiều vô hướng Unicode. Điều này có nghĩa là các ký tự khác nhau—và các cách thể hiện khác nhau của cùng một ký tự—có thể yêu cầu dung lượng bộ nhớ khác nhau để lưu trữ. Do đó, mỗi ký tự trong Swift không chiếm cùng một lượng bộ nhớ trong biểu diễn của chuỗi. Do đó, không thể tính số lượng ký tự trong một chuỗi nếu không lặp qua chuỗi để xác định ranh giới cụm biểu đồ mở rộng của nó. Nếu bạn đang làm việc với các giá trị chuỗi đặc biệt dài, hãy lưu ý rằng thuộc tính "albatross"38 phải lặp lại các đại lượng vô hướng Unicode trong toàn bộ chuỗi để xác định các ký tự cho chuỗi đó

Số ký tự được trả về bởi thuộc tính "albatross"38 không phải lúc nào cũng giống với thuộc tính "albatross"48 của một "albatross"0 chứa các ký tự giống nhau. Độ dài của "albatross"0 dựa trên số lượng đơn vị mã 16 bit trong biểu diễn UTF-16 của chuỗi chứ không phải số lượng cụm biểu đồ mở rộng Unicode trong chuỗi

Truy cập và sửa đổi một chuỗi¶

Bạn truy cập và sửa đổi một chuỗi thông qua các phương thức và thuộc tính của nó hoặc bằng cách sử dụng cú pháp chỉ số dưới

Chỉ số chuỗi¶

Mỗi giá trị String có một loại chỉ mục liên quan, "albatross"52, tương ứng với vị trí của mỗi Character trong chuỗi

Như đã đề cập ở trên, các ký tự khác nhau có thể yêu cầu dung lượng bộ nhớ khác nhau để lưu trữ, do đó, để xác định Character nào ở một vị trí cụ thể, bạn phải lặp lại từng biến vô hướng Unicode từ đầu hoặc cuối của String đó. Vì lý do này, các chuỗi Swift không thể được lập chỉ mục bởi các giá trị số nguyên

Sử dụng thuộc tính "albatross"56 để truy cập vị trí của Character đầu tiên của một String. Thuộc tính "albatross"59 là vị trí sau ký tự cuối cùng trong một String. Do đó, thuộc tính "albatross"59 không phải là đối số hợp lệ cho chỉ số dưới của chuỗi. Nếu String trống, "albatross"56 và "albatross"59 bằng nhau

Bạn truy cập các chỉ số trước và sau một chỉ số nhất định bằng phương pháp "albatross"65 và "albatross"66 của String. Để truy cập một chỉ mục cách xa chỉ mục nhất định, bạn có thể sử dụng phương thức "albatross"68 thay vì gọi một trong các phương thức này nhiều lần

Bạn có thể sử dụng cú pháp chỉ số dưới để truy cập vào Character tại một chỉ mục cụ thể của String

  1. hãy chào = "Thẻ Guten. "
  2. chào [ chào . startIndex ]
  3. // G
  4. chào [ chào . chỉ mục ( trước . lời chào . endIndex )]
  5. //
  6. chào [ chào . chỉ mục ( sau . lời chào . startIndex )]
  7. // bạn
  8. let index = chào . index ( lời chào . startIndex , offsetBy . 7 )
  9. chào [ chỉ mục ]
  10. // một

Cố gắng truy cập một chỉ mục nằm ngoài phạm vi của chuỗi hoặc một Character tại một chỉ mục nằm ngoài phạm vi của chuỗi sẽ gây ra lỗi thời gian chạy

  1. chào [ chào . endIndex ] // Lỗi
  2. lời chào . chỉ mục ( sau . lời chào . endIndex ) // Lỗi

Sử dụng thuộc tính "albatross"72 để truy cập tất cả các chỉ số của các ký tự riêng lẻ trong một chuỗi

  1. cho chỉ mục trong lời chào . chỉ số {
  2. in ( " \ (greeting[index]) ", terminator: "" )
  3. }
  4. // In ra "G u t e n T a g. "

Ghi chú

Bạn có thể sử dụng các thuộc tính "albatross"56 và "albatross"59 cũng như các phương thức "albatross"65, "albatross"66 và "albatross"68 trên bất kỳ loại nào phù hợp với giao thức "albatross"78. Điều này bao gồm String, như được hiển thị ở đây, cũng như các loại bộ sưu tập như "albatross"80, "albatross"81 và "albatross"82

Chèn và gỡ bỏ¶

Để chèn một ký tự vào một chuỗi tại một chỉ mục đã chỉ định, hãy sử dụng phương thức "albatross"83 và để chèn nội dung của một chuỗi khác tại một chỉ mục đã chỉ định, hãy sử dụng phương thức "albatross"84

  1. var chào mừng = "xin chào"
  2. chào mừng . chèn ( ". " , tại . chào mừng . endIndex )
  3. // chào mừng bây giờ bằng "xin chào. "
  4. chào mừng . insert ( contentsOf . " ở đó" , tại . chào mừng . chỉ mục ( trước . chào mừng . endIndex ))
  5. // chào mừng bây giờ bằng "xin chào. "

Để xóa một ký tự đơn khỏi một chuỗi tại một chỉ mục đã chỉ định, hãy sử dụng phương thức "albatross"85 và để xóa một chuỗi con tại một phạm vi đã chỉ định, hãy sử dụng phương thức "albatross"86

  1. chào mừng . xóa ( tại . chào mừng . chỉ mục ( trước . chào mừng . endIndex ))
  2. // chào mừng bây giờ bằng "xin chào"
  3. hãy phạm vi = chào mừng . index ( chào mừng . endIndex , offsetBy . -6 ). < chào mừng . endIndex
  4. chào mừng . removeSubrange ( phạm vi )
  5. // chào mừng bây giờ bằng "xin chào"

Ghi chú

Bạn có thể sử dụng các phương pháp "albatross"83, "albatross"84, "albatross"85 và "albatross"86 trên bất kỳ loại nào phù hợp với giao thức "albatross"91. Điều này bao gồm String, như được hiển thị ở đây, cũng như các loại bộ sưu tập như "albatross"80, "albatross"81 và "albatross"82

Chuỗi con¶

Khi bạn lấy một chuỗi con từ một chuỗi—ví dụ: sử dụng chỉ số dưới hoặc một phương thức như "albatross"96—kết quả là một phiên bản của "albatross"97, không phải một chuỗi khác. Chuỗi con trong Swift có hầu hết các phương thức giống như chuỗi, nghĩa là bạn có thể làm việc với chuỗi con giống như cách bạn làm việc với chuỗi. Tuy nhiên, không giống như chuỗi, bạn chỉ sử dụng chuỗi con trong một khoảng thời gian ngắn khi thực hiện các thao tác trên chuỗi. Khi bạn đã sẵn sàng lưu trữ kết quả trong thời gian dài hơn, bạn chuyển đổi chuỗi con thành một thể hiện của String. Ví dụ

  1. hãy lời chào = "Chào cả thế giới. "
  2. let index = chào . firstIndex ( of . "," ) ?? . greeting.endIndex
  3. hãy bắt đầu = chào [. < chỉ mục ]
  4. // bắt đầu là "Xin chào"
  5. // Chuyển kết quả thành String để lưu trữ lâu dài
  6. let newString = String ( beginning)

Giống như các chuỗi, mỗi chuỗi con có một vùng bộ nhớ nơi các ký tự tạo nên chuỗi con được lưu trữ. Sự khác biệt giữa chuỗi và chuỗi con là, để tối ưu hóa hiệu suất, chuỗi con có thể sử dụng lại một phần bộ nhớ được dùng để lưu trữ chuỗi gốc hoặc một phần bộ nhớ được sử dụng để lưu trữ một chuỗi con khác. (Các chuỗi có cách tối ưu hóa tương tự nhau, nhưng nếu hai chuỗi dùng chung bộ nhớ thì chúng bằng nhau. ) Tối ưu hóa hiệu suất này có nghĩa là bạn không phải trả chi phí hiệu suất sao chép bộ nhớ cho đến khi bạn sửa đổi chuỗi hoặc chuỗi con. Như đã đề cập ở trên, các chuỗi con không phù hợp để lưu trữ lâu dài—vì chúng sử dụng lại bộ nhớ của chuỗi gốc, toàn bộ chuỗi gốc phải được lưu trong bộ nhớ miễn là bất kỳ chuỗi con nào của nó đang được sử dụng

Trong ví dụ trên, "albatross"99 là một chuỗi, có nghĩa là nó có một vùng bộ nhớ nơi các ký tự tạo thành chuỗi được lưu trữ. Vì String00 là chuỗi con của "albatross"99 nên nó sử dụng lại bộ nhớ mà "albatross"99 sử dụng. Ngược lại, String03 là một chuỗi—khi được tạo từ chuỗi con, nó có bộ lưu trữ riêng. Hình dưới đây cho thấy các mối quan hệ này

Thoát html là gì

Ghi chú

Cả String"albatross"97 đều tuân theo giao thức String06, có nghĩa là các hàm thao tác chuỗi chấp nhận giá trị String06 thường thuận tiện. Bạn có thể gọi các hàm như vậy với giá trị String hoặc "albatross"97

So sánh chuỗi¶

Swift cung cấp ba cách để so sánh các giá trị văn bản. đẳng thức chuỗi và ký tự, đẳng thức tiền tố và đẳng thức hậu tố

Bình đẳng chuỗi và ký tự¶

Chuỗi và ký tự bằng nhau được kiểm tra bằng toán tử “bằng” (String10) và toán tử “không bằng” (String11), như được mô tả trong Toán tử so sánh:

  1. hãy trích dẫn = "Tôi và bạn rất giống nhau. "
  2. let sameQuotation = "Tôi và bạn rất giống nhau. "
  3. nếu báo giá == cùng báo giá {
  4. print ( "Hai chuỗi này được coi là bằng nhau" )
  5. }
  6. // In ra "Hai chuỗi này được coi là bằng nhau"

Hai giá trị String (hoặc hai giá trị Character) được coi là bằng nhau nếu các cụm biểu đồ mở rộng của chúng tương đương về mặt kinh điển. Các cụm biểu đồ mở rộng tương đương về mặt kinh điển nếu chúng có cùng ý nghĩa ngôn ngữ và hình thức, ngay cả khi chúng được tạo từ các vô hướng Unicode khác nhau đằng sau hậu trường

Ví dụ: "albatross"15 ("albatross"16) về cơ bản tương đương với "albatross"18 ("albatross"19) theo sau bởi "albatross"20 ("albatross"21). Cả hai cụm biểu đồ mở rộng này đều là những cách hợp lệ để biểu diễn ký tự "albatross"13 và vì vậy chúng được coi là tương đương về mặt kinh điển

  1. // "Voulez-vous un café?"
  2. let eAcuteQuestion = "Bạn có muốn đến quán cà phê\u{E9} không?"
  3. // "Voulez-vous un café?"
  4. let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301
  5. if eAcuteQuestion == combinedEAcuteQuestion {
  6. print ( "Hai chuỗi này được coi là bằng nhau" )
  7. }
  8. // In ra "Hai chuỗi này được coi là bằng nhau"

Ngược lại, String21 (String22, hoặc String23), như được sử dụng trong tiếng Anh, không tương đương với String24 (String25, hoặc String26), như được sử dụng trong tiếng Nga. Các ký tự giống nhau về mặt hình ảnh, nhưng không có cùng ý nghĩa ngôn ngữ

  1. let latinCapitalLetterA . Nhân vật = "\u{41}"
  2. let cyrillicCapitalLetterA . Nhân vật = "\u{0410}"
  3. if latinCapitalLetterA . = cyrillicCapitalLetterA {
  4. in ( "Hai ký tự này không tương đương. " )
  5. }
  6. // In ra "Hai ký tự này không tương đương. "

Ghi chú

So sánh chuỗi và ký tự trong Swift không nhạy cảm với ngôn ngữ

Bình đẳng tiền tố và hậu tố¶

Để kiểm tra xem một chuỗi có tiền tố hoặc hậu tố chuỗi cụ thể hay không, hãy gọi các phương thức String27 và String28 của chuỗi, cả hai phương thức này đều nhận một đối số loại String và trả về giá trị Boolean

Các ví dụ dưới đây xem xét một dãy các chuỗi đại diện cho các vị trí cảnh trong hai màn đầu tiên của vở kịch Romeo và Juliet của Shakespeare

  1. let romeoAndJuliet = [
  2. "Màn 1 Cảnh 1. Verona, Nơi công cộng" ,
  3. "Màn 1 Cảnh 2. Dinh thự của Capulet" ,
  4. "Màn 1 Cảnh 3. Một căn phòng trong biệt thự của Capulet" ,
  5. "Màn 1 Cảnh 4. Một con đường bên ngoài dinh thự của Capulet" ,
  6. "Màn 1 Cảnh 5. Đại Sảnh Đường trong dinh thự của Capulet" ,
  7. "Màn 2 Cảnh 1. Bên ngoài dinh thự của Capulet" ,
  8. "Màn 2 Cảnh 2. Vườn cây ăn trái của Capulet" ,
  9. "Màn 2 Cảnh 3. Bên ngoài phòng giam của Friar Lawrence" ,
  10. "Màn 2 Cảnh 4. Một con phố ở Verona" ,
  11. "Màn 2 Cảnh 5. Dinh thự của Capulet" ,
  12. "Màn 2 Cảnh 6. Phòng giam của tu sĩ Lawrence"
  13. ]

Bạn có thể sử dụng phương thức String27 với mảng String31 để đếm số cảnh trong Màn 1 của vở kịch

  1. var act1SceneCount = 0
  2. cho cảnh trong romeoAndJuliet {
  3. if cảnh . hasPrefix ( "Act 1 " ) {
  4. act1SceneCount += 1
  5. }
  6. }
  7. in ( "Có \ (act1SceneCount) scenes in Act 1")
  8. // In ra "Có 5 cảnh trong Màn 1"

Tương tự, sử dụng phương pháp String28 để đếm số cảnh diễn ra trong hoặc xung quanh biệt thự của Capulet và phòng giam của Friar Lawrence

  1. var mansionCount = 0
  2. var cellCount = 0
  3. cho cảnh trong romeoAndJuliet {
  4. if cảnh . hasSuffix ( "Dinh thự của Capulet" ) {
  5. mansionCount += 1
  6. } khác nếu cảnh . hasSuffix ( "Phòng giam của Friar Lawrence" ) {
  7. cellCount += 1
  8. }
  9. }
  10. in ( " \ (mansionCount) mansion scenes; \(cellCount) cell scenes")
  11. // In ra "6 cảnh dinh thự; 2 cảnh phòng giam"

Ghi chú

Các phương thức String27 và String28 thực hiện so sánh quy chuẩn tương đương từng ký tự giữa các cụm grapheme mở rộng trong mỗi chuỗi, như được mô tả trong Chuỗi và Đẳng thức ký tự.

Biểu diễn Unicode của Chuỗi¶

Khi một chuỗi Unicode được ghi vào một tệp văn bản hoặc một số bộ lưu trữ khác, các vô hướng Unicode trong chuỗi đó được mã hóa theo một số dạng mã hóa do Unicode xác định. Mỗi dạng mã hóa chuỗi thành các đoạn nhỏ được gọi là đơn vị mã. Chúng bao gồm dạng mã hóa UTF-8 (mã hóa chuỗi dưới dạng đơn vị mã 8 bit), dạng mã hóa UTF-16 (mã hóa chuỗi dưới dạng đơn vị mã 16 bit) và dạng mã hóa UTF-32 (mã hóa

Swift cung cấp một số cách khác nhau để truy cập các biểu diễn chuỗi Unicode. Bạn có thể lặp lại chuỗi bằng câu lệnh Character3-Character4, để truy cập các giá trị Character riêng lẻ của nó dưới dạng cụm biểu đồ mở rộng Unicode. Quá trình này được mô tả trong Làm việc với ký tự .

Ngoài ra, hãy truy cập giá trị String ở một trong ba cách biểu diễn tuân thủ Unicode khác

  • Một tập hợp các đơn vị mã UTF-8 (được truy cập bằng thuộc tính String39 của chuỗi)

  • Một tập hợp các đơn vị mã UTF-16 (được truy cập bằng thuộc tính String40 của chuỗi)

  • Tập hợp các giá trị vô hướng Unicode 21 bit, tương đương với dạng mã hóa UTF-32 của chuỗi (được truy cập bằng thuộc tính String41 của chuỗi)

Mỗi ví dụ bên dưới hiển thị một cách biểu diễn khác nhau của chuỗi sau, được tạo thành từ các ký tự String42, String43, String44, String45 (String46 hoặc ký tự vô hướng Unicode String47) và ký tự 🐶 (String48 hoặc ký tự vô hướng Unicode String49)

  1. let dogString = "Chó‼🐶"

Biểu diễn UTF-8¶

Bạn có thể truy cập biểu diễn UTF-8 của String bằng cách lặp qua thuộc tính String39 của nó. Thuộc tính này thuộc loại String52, là tập hợp các giá trị 8 bit không dấu (String53), một giá trị cho mỗi byte trong biểu diễn UTF-8 của chuỗi

Thoát html là gì

  1. for codeUnit in dogString . utf8 {
  2. in ( " \ (codeUnit) ", terminator: "" )
  3. }
  4. in ( "" )
  5. // In ra "68 111 103 226 128 188 240 159 144 182"

Trong ví dụ trên, ba giá trị String54 thập phân đầu tiên (String55, String56, String57) đại diện cho các ký tự String42, String43 và String44, có biểu diễn UTF-8 giống với biểu diễn ASCII của chúng. Ba giá trị String54 thập phân tiếp theo (String62, String63, String64) là biểu diễn UTF-8 ba byte của ký tự String46. Bốn giá trị String54 cuối cùng (String67, String68, String69, String70) là đại diện UTF-8 bốn byte của ký tự String48

Biểu diễn UTF-16¶

Bạn có thể truy cập biểu diễn UTF-16 của một String bằng cách lặp qua thuộc tính String40 của nó. Thuộc tính này thuộc loại String74, là tập hợp các giá trị 16 bit không dấu (String75), một giá trị cho mỗi đơn vị mã 16 bit trong biểu diễn UTF-16 của chuỗi

Thoát html là gì

  1. for codeUnit in dogString . utf16 {
  2. in ( " \ (codeUnit) ", terminator: "" )
  3. }
  4. in ( "" )
  5. // In ra "68 111 103 8252 55357 56374"

Xin nhắc lại, ba giá trị String54 đầu tiên (String55, String56, String57) đại diện cho các ký tự String42, String43 và String44, có các đơn vị mã UTF-16 có cùng giá trị như trong biểu diễn UTF-8 của chuỗi (vì các vô hướng Unicode này đại diện cho các ký tự ASCII

Giá trị String54 thứ tư (String84) là một số thập phân tương đương với giá trị thập lục phân String85, đại diện cho số vô hướng Unicode String47 cho ký tự String46. Ký tự này có thể được biểu diễn dưới dạng một đơn vị mã trong UTF-16

Các giá trị String54 thứ năm và thứ sáu (String89 và String90) là biểu diễn cặp thay thế UTF-16 của ký tự String48. Các giá trị này là giá trị thay thế cao của String92 (giá trị thập phân String89) và giá trị thay thế thấp là String94 (giá trị thập phân String90)

Biểu diễn vô hướng Unicode¶

Bạn có thể truy cập biểu diễn vô hướng Unicode của giá trị String bằng cách lặp qua thuộc tính String41 của nó. Thuộc tính này thuộc loại String98, là tập hợp các giá trị thuộc loại String99

Mỗi String99 có một thuộc tính String01 trả về giá trị 21 bit của vô hướng, được biểu thị trong một giá trị String02

Thoát html là gì

  1. cho vô hướng in dogString . unicodeScalars {
  2. in ( " \ (scalar.giá trị) " , bộ kết thúc . : "" )
  3. }
  4. in ( "" )
  5. // In ra "68 111 103 8252 128054"

Các thuộc tính String01 cho ba giá trị String99 đầu tiên (String55, String56, ________ 257) một lần nữa đại diện cho các ký tự _______ 242, _______ 243 và ________ 244

Giá trị String54 thứ tư (String84) lại là một số thập phân tương đương với giá trị thập lục phân String85, đại diện cho số vô hướng Unicode String47 cho ký tự String46

Thuộc tính String01 của String99 thứ năm và cuối cùng, String18, là một số thập phân tương đương với giá trị thập lục phân String19, đại diện cho số vô hướng Unicode String49 cho ký tự String48

Là một cách thay thế cho việc truy vấn các thuộc tính String01 của chúng, mỗi giá trị String99 cũng có thể được sử dụng để tạo một giá trị String mới, chẳng hạn như với phép nội suy chuỗi