본문으로 건너뛰기
cd /languages
  • Apple 플랫폼
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Swift 지원: iOS와 macOS를 위한 코드 그래프

Maguyva는 AST, 심볼, 그래프로 Swift를 지원하여, AI 에이전트가 iOS와 macOS 코드의 프로토콜, 익스텐션, 이니셜라이저, 옵저버를 따라갈 수 있게 합니다.

Swift에 파일 검색 이상의 것이 필요한 이유

Swift는 한 타입을 여러 곳에 펼쳐 놓습니다. 구조체는 한 파일에서 선언되고, 다른 세 파일의 익스텐션에서 동작을 얻으며, 패키지에 정의된 프로토콜을 준수합니다. 상태 변화는 계산 프로퍼티와 willSet / didSet 옵저버 속에 숨어 있습니다. 파일을 하나씩 읽는 에이전트는 그 대부분을 놓칩니다.

Maguyva는 그 구조를 인덱싱하므로, 에이전트는 한 타입의 멤버, 준수 관계, 호출자를 함께 볼 수 있습니다.

Maguyva가 Swift에서 추출하는 것

Maguyva는 .swift를 지원합니다. 호출 가능한 심볼에는 함수, init과 deinit, 서브스크립트, 계산 프로퍼티의 getter와 setter, willSet / didSet 옵저버가 포함되므로, 상태를 바꾸는 코드가 프로퍼티 본문에 묻히지 않고 심볼로 검색됩니다.

구조체, 열거형, 프로토콜, 익스텐션 안에 선언된 멤버는 소유 타입으로 한정되며(예: CartStore.add), 익스텐션에서 추가된 멤버는 확장된 타입에 귀속됩니다. 정의 이름에서는 제네릭 매개변수, 프로토콜 준수 목록, ? / ! 접미사가 제거되므로 조회는 순수한 이름으로 이루어집니다. 호출은 self.와 클래스 한정을 유지하고, 후행 클로저도 호출 인자 수에 포함됩니다.

그래프는 호출, 프로토콜 준수, 상속, 오버라이드, 인스턴스화, 속성(attribute), 타입 참조, 읽기와 쓰기, throw 엣지를 기록합니다.

에이전트 프롬프트 예시

  • “PaymentProvider를 준수하는 타입은 무엇이고, 각각 어디서 생성되나요?” (dependency_search)
  • “CartStore.add를 누가 호출하고, 어떤 뷰에서 호출하나요?” (find_symbol, 그다음 dependency_search incoming)
  • “푸시 알림이 받은 편지함 화면에 어떻게 도달하는지 설명해 줘.” (get_task_context)

알려진 한계

  • 매핑되는 것은 .swift 소스뿐입니다. Storyboard와 XIB 파일은 확장자 목록에 없으므로, Interface Builder의 연결은 그래프 밖에 있습니다.
  • print, debugPrint, NSLog, 어서션 같은 표준 라이브러리와 Foundation 호출은 관계에서 걸러지므로 그래프 엣지가 아닙니다. 이런 호출에는 text_pattern_search를 사용하세요.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 같은 제품을 Android에도 출시한다면 Kotlin 가이드를 읽어 보세요.

가장 적합한 경우

  • > 큰 앱 타깃과 공유 Swift 패키지를 가진 iOS 및 macOS 팀.
  • > 프로토콜과 익스텐션을 중심으로 만들어져 한 타입의 동작이 여러 파일에 흩어진 코드베이스.
  • > 공유 모델, 서비스, 프로토콜을 바꾸기 전에 영향 분석이 필요한 에이전트 워크플로.

에이전트 워크플로

  • > 프로토콜 요구 사항을 바꾸기 전에 그 프로토콜을 준수하는 모든 타입을 찾습니다.
  • > ViewModel, 코디네이터, 패키지를 넘나들며 서비스 메서드의 호출자를 추적합니다.
  • > 어떤 상태를 건드리는 이니셜라이저, 계산 프로퍼티, `didSet` 옵저버를 찾아냅니다.

엔진 세부 정보

  • > 호출 가능한 심볼에는 함수, `init`, `deinit`, 서브스크립트, 계산 프로퍼티의 getter와 setter, `willSet` / `didSet` 옵저버가 포함됩니다.
  • > 구조체, 열거형, 프로토콜, 익스텐션의 멤버는 `CartStore.add`처럼 소유 타입으로 한정됩니다.
  • > 정의 이름에서 제네릭 매개변수, 프로토콜 준수 목록, `?` / `!` 접미사가 제거되며, 호출은 `self.`와 클래스 한정을 유지합니다.

유용한 MCP 진입점

  • find_symbol

    정의와 참조가 필요할 때 타입, 프로토콜, 메서드 이름으로 쓰세요.

  • dependency_search

    프로토콜에 쓰면 준수하는 타입을, 메서드에 incoming으로 쓰면 호출자를 찾을 수 있습니다.

  • get_task_context

    “푸시 알림이 받은 편지함 화면에 어떻게 도달하는지 설명해 줘” 같은 프롬프트에 쓰세요.