ตัวอย่างต่อไปนี้ทั้งหมดใช้
var str = "Hello, playground"
สวิฟต์ 4
Strings ได้ยกเครื่องใหญ่สวยในสวิฟท์ 4. เมื่อคุณได้รับการย่อยบางส่วนจาก String ตอนนี้คุณจะได้รับชนิดหลังมากกว่าSubstring
String
ทำไมนี้ สตริงเป็นชนิดของค่าใน Swift ซึ่งหมายความว่าหากคุณใช้สตริงหนึ่งเพื่อสร้างสตริงใหม่จะต้องคัดลอกมา สิ่งนี้ดีต่อความมั่นคง (ไม่มีใครเปลี่ยนแปลงโดยที่คุณไม่รู้) แต่ก็แย่สำหรับประสิทธิภาพ
ซับสตริงตรงกันข้ามเป็นการอ้างอิงกลับไปยังสตริงดั้งเดิมที่มา นี่คือภาพจากเอกสารประกอบประกอบที่แสดงให้เห็นว่า
ไม่จำเป็นต้องทำสำเนาจึงมีประสิทธิภาพกว่ามาก อย่างไรก็ตามลองจินตนาการว่าคุณมีตัวอักขระย่อยสิบตัวจากสตริงตัวอักษรล้านตัว เนื่องจากซับสตริงอ้างอิงถึงสตริงระบบจะต้องยึดสตริงทั้งหมดไว้ตราบใดที่ซับสตริงอยู่ใกล้ ดังนั้นเมื่อใดก็ตามที่คุณจัดการสตริงย่อยของคุณเสร็จให้แปลงเป็นสตริง
let myString = String(mySubstring)
สิ่งนี้จะคัดลอกเฉพาะซับสตริงเหนือและหน่วยความจำที่เก็บสตริงเก่าสามารถเรียกคืนได้ สตริงย่อย (เป็นชนิด) มีความหมายว่ามีอายุสั้น
การปรับปรุงที่สำคัญอีกอย่างหนึ่งใน Swift 4 คือ Strings คือ Collections (อีกครั้ง) นั่นหมายความว่าสิ่งที่คุณสามารถทำได้กับคอลเลกชันคุณสามารถทำกับสตริง (ใช้ตัวห้อย, ย้ำตัวละครตัวกรอง ฯลฯ )
ตัวอย่างต่อไปนี้แสดงวิธีรับสตริงย่อยใน Swift
รับสตริงย่อย
คุณจะได้รับ substring จากสตริงโดยใช้ห้อยหรือจำนวนของวิธีการอื่น ๆ (เช่นprefix
, suffix
, split
) คุณยังจำเป็นต้องใช้String.Index
และไม่ใช่Int
ดัชนีสำหรับช่วงนั้น (ดูคำตอบอื่น ๆ ของฉันหากคุณต้องการความช่วยเหลือ)
จุดเริ่มต้นของสตริง
คุณสามารถใช้ตัวห้อย (สังเกตช่วงด้านเดียวของ Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
หรือprefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
หรือง่ายยิ่งขึ้น:
let mySubstring = str.prefix(5) // Hello
จุดสิ้นสุดของสตริง
ใช้ตัวห้อย:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
หรือsuffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
หรือง่ายยิ่งขึ้น:
let mySubstring = str.suffix(10) // playground
โปรดทราบว่าเมื่อใช้ฉันได้กลับมานับจากปลายโดยใช้suffix(from: index)
-10
ไม่จำเป็นเมื่อใช้suffix(x)
ซึ่งใช้x
อักขระตัวสุดท้ายของ String
ช่วงในสตริง
อีกครั้งเราก็ใช้ตัวห้อยที่นี่
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
แปลงSubstring
เป็นString
อย่าลืมเมื่อคุณพร้อมที่จะบันทึกสตริงย่อยของคุณคุณควรแปลงเป็นString
สตริงเพื่อให้สามารถล้างหน่วยความจำของสตริงเก่าได้
let myString = String(mySubstring)
ใช้Int
ส่วนขยายดัชนีหรือไม่
ฉันลังเลที่จะใช้Int
ส่วนขยายดัชนีตามหลังจากอ่านบทความStrings ใน Swift 3โดย Airspeed Velocity และ Ole Begemann แม้ว่าใน Swift 4 Strings นั้นเป็นชุดสะสม แต่ทีม Swift ก็ยังไม่ได้ใช้Int
ดัชนี มันยังString.Index
อยู่ สิ่งนี้เกี่ยวข้องกับ Swift อักขระที่ประกอบไปด้วยจำนวนรหัส Unicode ที่แตกต่างกัน ดัชนีจริงจะต้องมีการคำนวณที่ไม่ซ้ำกันสำหรับทุกสาย
ฉันต้องบอกว่าฉันหวังว่าทีมสวิฟท์จะหาหนทางที่จะเป็นนามธรรมString.Index
ในอนาคต แต่จนกว่าพวกเขาจะเลือกใช้ API ของพวกเขา มันช่วยให้ฉันจำได้ว่าการจัดการสตริงไม่ใช่แค่การInt
ค้นหาดัชนีอย่างง่าย