# Swift บน Maguyva: กราฟโค้ดสำหรับ iOS และ macOS

Canonical source: https://maguyva.ai/th/languages/swift

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva รองรับ Swift ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามโพรโทคอล, ส่วนขยาย, อินิเชียลไลเซอร์ และออบเซิร์ฟเวอร์ในโค้ด iOS และ macOS

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .swift
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- ทีม iOS และ macOS ที่มี target แอปขนาดใหญ่และแพ็กเกจ Swift ที่ใช้ร่วมกัน
- โค้ดเบสที่สร้างรอบโพรโทคอล และส่วนขยายซึ่งพฤติกรรมของชนิดข้อมูลกระจายอยู่ในหลายไฟล์
- เวิร์กโฟลว์ของเอเจนต์ที่ต้องวิเคราะห์ผลกระทบก่อนเปลี่ยนโมเดล บริการ หรือโพรโทคอลที่ใช้ร่วมกัน

## เวิร์กโฟลว์ของเอเจนต์

- หาทุกชนิดข้อมูลที่สอดคล้องกับโพรโทคอลหนึ่ง ก่อนเปลี่ยนข้อกำหนดข้อใดข้อหนึ่งของมัน
- ติดตามผู้เรียกเมธอดของบริการข้าม ViewModel, โคออร์ดิเนเตอร์ และแพ็กเกจ
- หาอินิเชียลไลเซอร์, พร็อพเพอร์ตีแบบคำนวณ และออบเซิร์ฟเวอร์ `didSet` ที่แตะสเตตหนึ่ง

## ทำไม Swift ต้องการมากกว่าการค้นหาไฟล์

Swift กระจายชนิดข้อมูลหนึ่งไปหลายที่ struct ถูกประกาศในไฟล์หนึ่ง ได้รับพฤติกรรมจากส่วนขยายในอีกสามไฟล์ และสอดคล้องกับโพรโทคอลที่นิยามไว้ในแพ็กเกจ การเปลี่ยนสเตตซ่อนอยู่ในพร็อพเพอร์ตีแบบคำนวณ และออบเซิร์ฟเวอร์ `willSet` / `didSet` เอเจนต์ที่อ่านทีละไฟล์จะพลาดสิ่งเหล่านี้ไปเกือบหมด

Maguyva ทำดัชนีโครงสร้างนี้ เพื่อให้เอเจนต์เห็นสมาชิก การสอดคล้อง และผู้เรียกของชนิดข้อมูลไปพร้อมกัน

## Maguyva ดึงอะไรจาก Swift ได้บ้าง

Maguyva ครอบคลุม `.swift` สัญลักษณ์ที่เรียกใช้ได้รวมถึงฟังก์ชัน, `init` และ `deinit`, subscript, getter และ setter ของพร็อพเพอร์ตีแบบคำนวณ และออบเซิร์ฟเวอร์ `willSet` / `didSet` โค้ดที่เปลี่ยนสเตตจึงค้นหาได้ในฐานะสัญลักษณ์ แทนที่จะหายไปในตัวของพร็อพเพอร์ตี

สมาชิกที่ประกาศใน struct, enum, โพรโทคอล และส่วนขยายจะถูกระบุด้วยชนิดข้อมูลเจ้าของ (เช่น `CartStore.add`) และสมาชิกที่เพิ่มในส่วนขยายจะถูกนับเป็นของชนิดข้อมูลที่ถูกขยาย พารามิเตอร์เจเนอริก รายการการสอดคล้องกับโพรโทคอล และซัฟฟิกซ์ `?` / `!` ถูกตัดออกจากชื่อนิยาม การค้นหาจึงใช้ชื่อเปล่า การเรียกยังเก็บ `self.` และตัวระบุคลาสไว้ และโคลเชอร์ท้ายการเรียกถูกนับรวมในจำนวนอาร์กิวเมนต์ของการเรียก

กราฟบันทึกการเรียก การสอดคล้องกับโพรโทคอล การสืบทอด การ override การสร้างอินสแตนซ์ แอตทริบิวต์ การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และเส้นเชื่อม `throw`

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "ชนิดข้อมูลใดสอดคล้องกับ `PaymentProvider` และแต่ละตัวถูกสร้างที่ใด" (`dependency_search`)
- "ใครเรียก `CartStore.add` และเรียกจากวิวใดบ้าง" (`find_symbol` แล้วตามด้วย `dependency_search` ทิศทางขาเข้า)
- "อธิบายว่าการแจ้งเตือนแบบพุชไปถึงหน้าจอกล่องข้อความได้อย่างไร" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- มีเพียงซอร์ส `.swift` ที่ถูกจับคู่ ไฟล์ Storyboard และ XIB ไม่อยู่ในรายการนามสกุลไฟล์ การเชื่อมต่อของ Interface Builder จึงอยู่นอกกราฟ
- การเรียกไลบรารีมาตรฐานและ Foundation เช่น `print`, `debugPrint`, `NSLog` และแอสเซอร์ชันถูกกรองออกจากความสัมพันธ์ จึงไม่เป็นเส้นเชื่อมในกราฟ ใช้ `text_pattern_search` สำหรับกรณีเหล่านี้

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) หากคุณมีผลิตภัณฑ์เดียวกันบน Android ให้อ่าน[คู่มือภาษา Kotlin](/th/languages/kotlin)

## รายละเอียดเอนจิน

- สัญลักษณ์ที่เรียกใช้ได้รวมถึงฟังก์ชัน, `init`, `deinit`, subscript, getter และ setter ของพร็อพเพอร์ตีแบบคำนวณ และออบเซิร์ฟเวอร์ `willSet` / `didSet`
- สมาชิกของ struct, enum, โพรโทคอล และส่วนขยายถูกระบุด้วยชนิดข้อมูลเจ้าของ เช่น `CartStore.add`
- พารามิเตอร์เจเนอริก รายการการสอดคล้องกับโพรโทคอล และซัฟฟิกซ์ `?` / `!` ถูกตัดออกจากชื่อนิยาม และการเรียกเก็บ `self.` และตัวระบุคลาสไว้

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับชื่อชนิดข้อมูล โพรโทคอล หรือเมธอด เมื่อต้องการนิยามและการอ้างอิง
- `dependency_search`: ใช้บนโพรโทคอล เพื่อหาชนิดข้อมูลที่สอดคล้อง หรือใช้ทิศทางขาเข้าบนเมธอดเพื่อหาผู้เรียก
- `get_task_context`: ใช้กับพรอมต์อย่าง “อธิบายว่าการแจ้งเตือนแบบพุชไปถึงหน้าจอกล่องข้อความได้อย่างไร”
