คำนำ
การเพิ่มคุณสมบัติหรือน้ำตาลไวยากรณ์ลงในสตริงข้อความเป็นเรื่องธรรมดาในภาษาการเขียนโปรแกรมต่างๆ ใช้ภาษา C ที่ทุกคนคุ้นเคยเช่น สตริง C เป็นอาร์เรย์ตัวละคร แต่ทุกครั้งที่คุณป้อนสตริงคุณไม่จำเป็นต้องป้อน ['H', 'e', 'l', 'l', 'o'] เพียงกดปุ่ม Hello เพราะคอมไพเลอร์ทำสิ่งนี้ให้คุณ
ภาษาขั้นสูงอื่น ๆ เช่น Swift จัดการสตริงไม่เพียง แต่เป็นอาร์เรย์อักขระสตริงเป็นประเภทที่สมบูรณ์และมีคุณสมบัติต่าง ๆ ก่อนอื่นให้ดูคุณสมบัติของสตริง: Substring
ดูสตริง
ก่อนอื่นให้ทำความเข้าใจอย่างคร่าวๆเกี่ยวกับการใช้สตริง รหัสต่อไปนี้มาจาก string.swift ในไลบรารีมาตรฐาน:
สตริงโครงสร้างสาธารณะ {public var _core: _stringcore}แน่นอนว่ามีการตั้งค่าการเริ่มต้นอื่น ๆ แต่มีเพียงแอตทริบิวต์การจัดเก็บนี้ในการประกาศ! ความลับจะต้องอยู่ใน StringCore.swift:
โครงสร้างสาธารณะ _stringcore {public var _baseaddress: unsafemutablerawpointer? var _countandflags: Uint Public Var _owner: anyobject?}มีสิ่งอื่น ๆ อีกมากมายในประเภทนี้ แต่เรามุ่งเน้นไปที่คุณสมบัติการจัดเก็บเท่านั้น:
สถานการณ์ที่แท้จริงของ _stringcore นั้นซับซ้อนกว่าที่กล่าวถึงที่นี่มาก แต่เนื้อหาข้างต้นทำให้เข้าใจข้อมูลบางอย่างเกี่ยวกับสตริงได้ง่ายขึ้น: การจัดเก็บภายในและขนาดของสตริง
เครื่องประดับ
จะสร้างสายย่อยใน Swift ได้อย่างไร? วิธีที่ง่ายที่สุดคือการใช้ย่อหน้าจากสตริงโดยตัวห้อย:
ให้ str = "สวัสดี Swift!" ให้ Slice = str [str.startindex .. <str index = "" str = "" startIndex = "" nbsp = "" ออฟเซ็ตบี: = "" 5 = "" สวัสดี = ""> </str>
แม้ว่ามันจะง่าย แต่รหัสก็ดูไม่สวยงามเกินไป
ดัชนีของสตริงไม่ได้เป็นจำนวนเต็มที่ใช้งานง่ายดังนั้นดัชนีตำแหน่งในระหว่างการสกัดกั้นจะต้องได้รับโดยใช้ startindex และดัชนี (_: Offsetby :) หากคุณสกัดกั้นจากตำแหน่งเริ่มต้นของสตริงคุณสามารถละเว้น startIndex:
ให้กับ partialRange = str [.. <str index = "" str = "" startIndex = "" nbsp = "" ออฟเซ็ตบี: = "" 5 = "" ยังคง = "" hello = ""> </str>
หรือใช้วิธีนี้ในการรวบรวม:
ให้ Slice = str.prefix (5) // ยังคง "สวัสดี"
โปรดจำไว้ว่าสตริงยังเป็นคอลเลกชันดังนั้นคุณสามารถใช้วิธีการภายใต้คอลเลกชันเช่นคำนำหน้า (), คำต่อท้าย (), dropfirst () ฯลฯ
หลักการภายในของ substring
Substring สถานที่ที่มีมนต์ขลังคือพวกเขานำหน่วยความจำของสตริงแม่กลับมาใช้ซ้ำ คุณสามารถเข้าใจ substring เป็นหนึ่งในย่อหน้าของสตริงหลัก
ตัวอย่างเช่นหากคุณตัด 100 อักขระจากสตริงอักขระ 8000 คุณไม่จำเป็นต้องปรับพื้นที่หน่วยความจำ 100 ตัวอักษรใหม่
นี่ก็หมายความว่าคุณอาจขยายวงจรชีวิตของสตริงหลักโดยไม่ตั้งใจ หากมีสตริงขนาดใหญ่คุณเพียงแค่สกัดกั้นเซ็กเมนต์ขนาดเล็กตราบใดที่สตริงเซ็กเมนต์ขนาดเล็กที่สกัดกั้นไม่ได้ถูกปล่อยออกมาสตริงเซ็กเมนต์ขนาดใหญ่จะไม่ถูกปล่อยออกมา
Substring ทำอย่างไร?
โครงสร้างย่อยโครงสร้างสาธารณะ {ภายใน var _slice: rangereplaceablebidirectionalsLice <String> </string>แอตทริบิวต์ _slice ภายในเก็บข้อมูลทั้งหมดเกี่ยวกับสตริงหลัก:
// ยังคงอยู่ใน substringInternal var _wholestring: สตริง {return _slice._base} public var startindex: ดัชนี {return _slice.startindex} public var endindex: ดัชนี {return _slice.endindex}}คำนวณคุณสมบัติ _wholestring (ส่งคืนสตริงพาเรนต์ทั้งหมด), StartIndex และ EndIndex นั้นถูกส่งกลับผ่าน _slice ภายใน
นอกจากนี้ยังสามารถเห็นได้ว่าชิ้นหมายถึงสตริงหลักอย่างไร
substring ถึงสตริง
ในที่สุดอาจมีส่วนย่อยมากมายในรหัส แต่ประเภทพารามิเตอร์ของฟังก์ชันต้องใช้สตริง กระบวนการแปลงสตริงย่อยเป็นง่ายมากเช่นกัน:
ให้สตริง = สตริง (substring)
เนื่องจาก substrings ใช้พื้นที่หน่วยความจำเดียวกันกับสตริงหลักจึงคาดเดาได้ว่าการสร้างสตริงใหม่ควรเริ่มต้นพื้นที่จัดเก็บใหม่ แล้วกระบวนการเริ่มต้นสตริงคืออะไร?
ส่วนขยายสตริง {public init (_ substring: substring) {// 1 let x = substring._wholestring // 2 ให้ start = substring.startindex ปล่อยให้ end = substring.endIndex // 3 ให้ u16 = x._core [start.encodedoffset .. ใน: = "" x = "" unicodescalars = "" end = "" self = "" 4b = "" else = ""> </dern> "ขั้นตอนในการแปลงสายย่อยเป็นสตริงนั้นง่ายมาก แต่คุณอาจต้องการพิจารณาว่าคุณต้องทำสิ่งนี้หรือไม่ คุณต้องการประเภทที่จะเป็นสตริงเมื่อทำการดำเนินการย่อยหรือไม่? หากการดำเนินการทั้งหมดบนสตริงย่อยจำเป็นต้องได้รับการแปลงเป็นสตริงแล้วสตริงย่อยที่มีน้ำหนักเบาจะสูญเสียความหมาย
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com