การดึงข้อมูลย่อยออกมา

Swift:
การดึงข้อมูลย่อยออกมา

วิธีการ:

Swift ทำให้การทำงานกับส่วนย่อยสตริงค่อนข้างตรงไปตรงมา มาลองดำดิ่งลงไปดูกันเลยด้วยตัวอย่าง

let fullString = "Hello, Swift Programmer!"
let startIndex = fullString.index(fullString.startIndex, offsetBy: 7)
let endIndex = fullString.index(fullString.startIndex, offsetBy: 12)

// การแยกส่วนย่อยสตริงโดยใช้ String.Index
let substring = fullString[startIndex...endIndex]

print(substring) // "Swift"

// อีกวิธีหนึ่ง, โดยใช้ NSRange และ NSString
import Foundation

let nsRange = NSRange(location: 7, length: 6)
if let range = Range(nsRange, in: fullString) {
    let substring = fullString[range]
    print(substring) // "Swift"
}

// วิธีสั้น, ถ้าคุณรู้ดัชนีที่แน่นอน
let quickSubstring = fullString[7...12]

print(quickSubstring) // จะเกิดข้อผิดพลาดเพราะ Swift strings ไม่รองรับการดัชนีด้วยเลขจำนวนเต็ม

ผลลัพธ์:

Swift
Swift
// ข้อผิดพลาด: 'subscript(_:)' ไม่สามารถใช้งานได้: ไม่สามารถใช้ subscript String ด้วย Int ได้ ดูเอกสารของ String เพื่อข้อมูลเพิ่มเติม

การศึกษาลึกลงไป

การแยกส่วนย่อยสตริงใน Swift ต้องเข้าใจว่า Swift จัดการกับสตริงอย่างไร ซึ่งแตกต่างจากภาษาเช่น Python หรือ C# ใน Swift, สตริงเป็นคอลเล็กชันของอักขระที่ไม่ใช้ดัชนีจำนวนเต็ม สิ่งนี้มาจากการที่ Swift รองรับอักขระที่เป็นมาตรฐาน Unicode ทำให้สตริงไม่มีความยาวคงที่ แต่เป็นคอลเล็กชันของกลุ่มกราฟีม (ที่ผู้ใช้รับรู้เป็นอักขระเดียว)

การออกแบบนี้หมายความว่าการดัชนีโดยตรงด้วยเลขจำนวนเต็มไม่เหมาะกับสตริง Swift; คุณต้องทำงานด้วย String.Index แม้ว่าจะไม่ใช่สิ่งที่ใช้งานง่ายเช่นการใช้เลขจำนวนเต็ม แต่มันก็จัดการกับสคริปต์ข้อความและอิโมจิได้อย่างสอดคล้องกัน

ทางเลือกอื่น ๆ รวมถึงการใช้ NSString จาก Objective-C ตามตัวอย่างที่แสดง ซึ่งอนุญาตให้ใช้ NSRange แต่นั่นเป็นสิ่งที่ค่อนข้างเก่าและไม่เป็น Swift นับตั้งแต่ Swift 4 สตริงเองได้รับการปรับปรุงมากมายด้วย API ที่มีประสิทธิภาพและใช้งานง่ายมากขึ้นเพื่อทำงานกับส่วนย่อยสตริง ทำให้ NSString ไม่ค่อยถูกใช้สำหรับงานส่วนใหญ่

รายละเอียดการปฏิบัติมีความสำคัญ—การแยกส่วนย่อยสตริงอย่างง่ายๆ อาจทำให้เกิดผลกระทบต่อประสิทธิภาพเนื่องจากการเรียกใช้ index(_: offsetBy:) อาจเป็น O(n) เมื่อจัดการกับสตริงที่รองรับ Unicode นอกจากนี้ เมื่อคุณสร้างส่วนย่อยสตริงใน Swift มันจะแชร์หน่วยความจำของสตริงต้นฉบับทำให้มีประสิทธิภาพ แต่ต้องระวังหากคุณแก้ไขสตริงต้นฉบับในภายหลัง

ดูเพิ่มเติม

สำหรับหัวข้อนี้เพิ่มเติม สามารถเข้าชมเอกสารอย่างเป็นทางการ:

ใช้เวลาฝึกฝนและเล่นใน Swift playground เพื่อทำความเข้าใจมันอย่างลึกซึ้ง